-1

我有 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 个组合)?

4

1 回答 1

2

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

>>> 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]]
于 2013-07-10T02:02:30.433 回答