This question already has an answer here:

Getting all possible value combinations
(1个答案)
我想得到一个不确定的列表数量,不确定的长度,并从每个列表中生成一个元素的每个可能组合。为了提高效率,我可以简单地遍历每个组合,而不是存储结果。
例如,以下列表:
[['A','B','C'],['w','x','y','z'],[1,2]]

会变成:
['A','w',1],['A','w',2],['A','x',1],['A','x',2],...,['C','z',1],['C','z',2]

不完全是压缩,不完全是itertools.permutation()…如果你提前知道列表的数量,很容易做到这一点,但在这种情况下我不会。我相信我可以找到一个递归的解决方案来解决这个问题,但也许这个问题已经解决了。有什么见解吗?

最佳答案

itertools.product是适合你的工具

>>> some_list = [['A','B','C'],['w','x','y','z'],[1,2]]
>>> list(itertools.product(*some_list))
[('A', 'w', 1), ('A', 'w', 2), ('A', 'x', 1), ('A', 'x', 2), ('A', 'y', 1), ('A', 'y', 2), ('A', 'z', 1), ('A', 'z', 2), ('B', 'w', 1), ('B', 'w', 2), ('B', 'x', 1), ('B', 'x', 2), ('B', 'y', 1), ('B', 'y', 2), ('B', 'z', 1), ('B', 'z', 2), ('C', 'w', 1), ('C', 'w', 2), ('C', 'x', 1), ('C', 'x', 2), ('C', 'y', 1), ('C', 'y', 2), ('C', 'z', 1), ('C', 'z', 2)]

几个要点
itertools.product期望iterables作为参数所以需要使用splat运算符将列表作为参数传递
itertools.product返回生成器。你需要将它转换成一个列表,以转储整个内容。或者,您可以迭代它或传递给一个期望iterable的函数。
for e in itertools.product(*some_list):
    print e

09-10 03:01
查看更多