Python 如何使用组合

Python 如何使用组合,python,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,

我有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)
但这根本不会产生任何效果。当我打印可用的组合时,我得到:

[[0,0,0],[0,0,1],[0,1,0]]
我的问题是:使用组合,如何为我拥有的6个不同集合生成所有可能的组合(从2到6个组合)?

使用
范围(1,len(lis)+1)
获取传递给
组合的第二个参数(
r
)的值。或者
范围(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])
正如may@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]]

源代码的复制粘贴将生成一组3种组合。你确定你打印的变量是正确的吗?作为旁注:最后的循环与
可用组合=列表(组合)
完全相同,只是速度较慢且更难阅读。输出不是
[[0,0,0],[0,0,1],[0,1,0]
,而是
[([0,0,0],[0,0,1]),([0,0,0],[0,1,0]),([0,0,0])
。这正是我所期望的。如果你有不同的期望,请告诉我们你的期望,我们可以告诉你如何得到它。还有:你有什么“6套不同的”呢?您有3个列表,每个列表包含3个数字。我想不出任何办法能从中得到6。为什么
d。。。。直到f
位?现在还不清楚如何继续这个模式,而你已经为自己保存了三行复制和粘贴,只需要写一行?除非你使用的是300波特的调制解调器,不能忍受等待30秒来粘贴,为什么不直接给我们实际的数据呢?和实际预期输出的片段,而不是该输出的描述?你让你自己和所有试图帮助你的人都变得更加困难。从第一段我可以看出,他不想要这个,他想要
[0,0,0]+[0,0,1]
,然后
[0,0,0]+[0,1,0]
,然后
[0,0,0]+[0,0,1]+[0,1]
,然后
[0,0,1]+[0,1]
,但不是原始的个人列表。这是…不是组合,我也不确定它是什么。因此,我认为这并不能回答他的问题,但我不知道他的问题是否可以在没有澄清的情况下得到回答……也许他想要
[在组合(lis,1)中对I(2,len(lis)+1)对c进行展平(c)]
(其中
展平=itertools.chain.from_iterable
)?@abarnert可能是他想要的,我已经更新了我的答案,添加了
flant
版本。@Ashwini Chaudhary:我实际上想要每个组合的总和,从2个组合到6个组合。但是,如果创建组合,那么答案的第一部分就起到了作用(我的帖子中的代码显示,这与我无关)。然后,我将添加一些代码来对每个组合求和,并将求和添加到最终列表中。