从两个数组创建所有可能的组合
Posted
技术标签:
【中文标题】从两个数组创建所有可能的组合【英文标题】:Creating all possible combinations from two arrays 【发布时间】:2020-02-29 13:20:34 【问题描述】:我正在想办法解决以下问题:
给定任意两个数组 'a' 和 'b' 我想创建所有组合列表,每个组合应该包含来自 'a' 的一个元素和来自 'b' 的一个元素的元组
例如:
a = ['p', 'q'], b = [True, False]
输出应该如下:
['p': False, 'q': False, 'p': False, 'q': True, 'p': True, 'q':
False, 'p': True, 'q': True]
【问题讨论】:
你能在你的帖子中附加两个数组'a'和'b'吗? 我可能可以追加它们,没有真正的限制,我只是在寻找效率 你在寻找itertools library,我不认为你会在 python 中找到更高效的东西 我一直在尝试使用该库中的产品功能。但我想不出一种方法来制作我想要的东西,而不必迭代产品并删除重复的值 @ItamarMushkin 很遗憾,不,这会让我遇到和以前一样的问题。我必须清除我不需要的不良组合。 【参考方案1】:你可以使用itertools.product 和repeat=2
这是一个构建字典列表的工作示例
[k1:v1, k2:v2 for k1,v1,k2,v2 in itertools.product(a,b,repeat=2) if k1 != k2]
【讨论】:
我会补充一点,虽然这个解决方案需要考虑长度为 2 我给出的只是一个例子。 a 可以是任意长度,b 在我的情况下可以是长度 2 但我想假设一个一般情况【参考方案2】:from itertools import product
dicts = [k:v for k,v in zip(keys, tup) for tup in list(product(values, repeat=len(keys)))]
【讨论】:
OP - 请注意,这个答案并不依赖于知道长度都是 2! 这样就完成了。但是它确实假设值和键的数量应该相同,遗憾的是我可以拥有比值更多的键 @edanpatt 我更新了我的答案,现在不需要相等的长度【参考方案3】:a = ['p', 'q']
b = [True, False]
import itertools
result = [values[0]: values[1] for values in list(itertools.product(a,b))]
print(result)
这是你需要的吗?
【讨论】:
这是一个不错的开始,但不,在这样做之后,您必须创建此函数创建的字典的所有可能组合【参考方案4】:from itertools import product
lst = [dict(zip(a,pair)) for pair in product(b,b)]
输出:
['p': True, 'q': True,
'p': True, 'q': False,
'p': False, 'q': True,
'p': False, 'q': False]
编辑:
既然你说a
可以是任意长度,那么你就不需要b
。
from itertools import permutations
import numpy as np
a = ['p','q','r','s','t']
list1 = list(permuations(a))
set1 = tuple(np.array(a) == np.array(i)) for i in list1
final_list = [dict(zip(a,i)) for i in set1]
输出:
['p': True, 'q': False, 'r': False, 's': False, 't': False,
'p': True, 'q': False, 'r': True, 's': True, 't': False,
'p': False, 'q': False, 'r': False, 's': False, 't': True,
'p': True, 'q': False, 'r': True, 's': False, 't': False,
'p': False, 'q': False, 'r': True, 's': True, 't': True,
'p': True, 'q': False, 'r': False, 's': True, 't': False,
'p': False, 'q': False, 'r': False, 's': True, 't': True,
'p': False, 'q': False, 'r': True, 's': False, 't': True,
'p': False, 'q': True, 'r': False, 's': False, 't': False,
'p': False, 'q': True, 'r': True, 's': True, 't': False,
'p': False, 'q': True, 'r': False, 's': True, 't': False,
'p': False, 'q': True, 'r': True, 's': False, 't': False,
'p': True, 'q': True, 'r': True, 's': False, 't': False,
'p': True, 'q': True, 'r': False, 's': True, 't': False,
'p': True, 'q': True, 'r': False, 's': False, 't': False,
'p': True, 'q': True, 'r': False, 's': False, 't': True,
'p': True, 'q': False, 'r': False, 's': True, 't': True,
'p': True, 'q': False, 'r': True, 's': False, 't': True,
'p': False, 'q': False, 'r': False, 's': True, 't': False,
'p': False, 'q': False, 'r': True, 's': False, 't': False,
'p': True, 'q': False, 'r': False, 's': False, 't': True,
'p': False, 'q': False, 'r': False, 's': False, 't': False,
'p': False, 'q': False, 'r': True, 's': True, 't': False,
'p': False, 'q': True, 'r': False, 's': True, 't': True,
'p': False, 'q': True, 'r': True, 's': False, 't': True,
'p': True, 'q': True, 'r': True, 's': True, 't': True,
'p': False, 'q': True, 'r': False, 's': False, 't': True]
【讨论】:
以上是关于从两个数组创建所有可能的组合的主要内容,如果未能解决你的问题,请参考以下文章