查找列表中的组合(Python)

时间:2015-05-26 20:39:38

标签: python list python-2.7

我试图用Python编写程序来解决PictoLogic游戏问题。我目前正在尝试从水平数字中编写所有可能的电路板。所以,我有这样的事情:

lines = [[all possible combos for line 1], [same for line 2], [same for line 3], etc]

这个列表有不同的长度,我还有另一个版本,它们将成为一个dict(带有indexex 1,2,3等)

想法是获得所有可能的电路板组合。例如:

lines = [["aa", "ab", "ba"], ["cc"]]

将导致

[["aa", "cc"], ["ab", "cc"], ["ba", "cc"]]

那,但是有不同长度的列表,并且事先不知道行数。 提前致谢,对不好的英语表示抱歉

3 个答案:

答案 0 :(得分:2)

您可以使用itertools.product并通过解包操作(*)将子列表传递给此代理:

>>> lines = [['aa', 'ab', 'ba'], ['cc']]
>>> from itertools import product
>>> list(product(*lines))
[('aa', 'cc'), ('ab', 'cc'), ('ba', 'cc')]

如果您想将结果作为列表,则可以使用map函数:

>>> map(list,product(*lines))
[['aa', 'cc'], ['ab', 'cc'], ['ba', 'cc']]

答案 1 :(得分:2)

考虑这种方式:

a = ['a', 'b', 'c']
b = ['x', 'y']

print [[i,j] for i in a for j in b]
>> [['a', 'x'], ['a', 'y'], ['b', 'x'], ['b', 'y'], ['c', 'x'], ['c', 'y']]

答案 2 :(得分:0)

您可以使用itertools.product和解包运算符*:

执行此操作
lines = [["aa", "ab", "ba"], ["cc"]]
from itertools import product
print list(list(t) for t in product(*lines))
# >>> [['aa', 'cc'], ['ab', 'cc'], ['ba', 'cc']]