如何使用组合

时间:2013-07-10 02:00:34

标签: python

我有6个列表,比如说,

a=[1,1,0,0]
b=[0,1,1,0]
c=[0,0,1,1]
d .... until f.

我想生成从2个列表到6个列表的列表的所有可能组合的总和结果。例如,我想计算a + b,a + c,... a + f的结果。然后,a + b + c,a + b + d,......等。我知道锄头要计算两个或三个列表的结果,但我仍然坚持如何为列表生成组合。我尝试定义列表列表并使用带参数2的组合为3个列表生成所有可能的2个组合(例如),如下所示:

import itertools

alphabet = [[0,0,0],[0,0,1],[0,1,0]]

combos = itertools.combinations(alphabet, 2)

usable_combos = []
for e in combos:
    usable_combos.append(e)

但这根本不会产生任何结果。当我打印usable_combos时,我得到:

[[0,0,0],[0,0,1],[0,1,0]]

我的问题是:使用组合,如何为我拥有的6种不同的套装生成所有可能的组合(从2到6种组合)?

1 个答案:

答案 0 :(得分:2)

使用range(1, len(lis)+1)获取传递给r的第二个参数(combinations)的值。如果您想从2开始,请range(2, len(lis)+1)

>>> from itertools import combinations
>>> lis = [[0,0,0],[0,0,1],[0,1,0]]
>>> for i in range(1, len(lis)+1):
...     for c in combinations(lis,i):
...         print c
...         
([0, 0, 0],)
([0, 0, 1],)
([0, 1, 0],)
([0, 0, 0], [0, 0, 1])
([0, 0, 0], [0, 1, 0])
([0, 0, 1], [0, 1, 0])
([0, 0, 0], [0, 0, 1], [0, 1, 0])

正如@abarnert在评论中指出的那样,可能你想要这个:

>>> from pprint import pprint
>>> from itertools import chain
>>> flatten = chain.from_iterable
>>> ans = [list(flatten(c)) for i in range(2, len(lis)+1) for c in permutations(lis,i)]
>>> pprint(ans)
[[0, 0, 0, 0, 0, 1],
 [0, 0, 0, 0, 1, 0],
 [0, 0, 1, 0, 0, 0],
 [0, 0, 1, 0, 1, 0],
 [0, 1, 0, 0, 0, 0],
 [0, 1, 0, 0, 0, 1],
 [0, 0, 0, 0, 0, 1, 0, 1, 0],
 [0, 0, 0, 0, 1, 0, 0, 0, 1],
 [0, 0, 1, 0, 0, 0, 0, 1, 0],
 [0, 0, 1, 0, 1, 0, 0, 0, 0],
 [0, 1, 0, 0, 0, 0, 0, 0, 1],
 [0, 1, 0, 0, 0, 1, 0, 0, 0]]