从两个数组创建所有可能的组合

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]

【讨论】:

以上是关于从两个数组创建所有可能的组合的主要内容,如果未能解决你的问题,请参考以下文章

生成所有可能的数组组合

从两个单独的列表创建组合列表

如何创建所有数字组合的n维数组?

如何从两个数组中所有元素的乘积创建矩阵?

[Python]:生成所有可能组合的数组

如何从一个1d Numpy数组的所有排列组合中删除所有的圆台排列组合?