Python列表列表的所有组合

时间:2015-10-14 15:56:21

标签: python list tuples combinations itertools

所以我有一个字符串列表

[['a','b'],['c','d'],['e','f']]

我希望得到所有可能的组合,结果是

[['a','b'],['c','d'],['e','f'],
 ['a','b','c','d'],['a','b','e','f'],['c','d','e','f'],
 ['a','b','c','d','e','f']]

到目前为止,我已经提出了这段代码

input = [['a','b'],['c','d'],['e','f']]
combs = []
for i in xrange(1, len(input)+1):
    els = [x for x in itertools.combinations(input, i)]
    combs.extend(els)
print combs

主要遵循this post中的答案。

但结果是

[(['a','b'],),(['c','d'],),(['e','f'],),
 (['a','b'],['c','d']),(['a','b'],['e','f']),(['c','d'],['e','f']),
 (['a','b'],['c', 'd'],['e', 'f'])]

我现在很难过,试图找到一种优雅的pythonic方法来打开那些元组。

4 个答案:

答案 0 :(得分:6)

您可以使用itertools.chain.from_iterable将列表元组展平为一个列表。示例 -

import itertools
input = [['a','b'],['c','d'],['e','f']]
combs = []
for i in xrange(1, len(input)+1):
    els = [list(itertools.chain.from_iterable(x)) for x in itertools.combinations(input, i)]
    combs.extend(els)

演示 -

>>> import itertools
>>> input = [['a','b'],['c','d'],['e','f']]
>>> combs = []
>>> for i in range(1, len(input)+1):
...     els = [list(itertools.chain.from_iterable(x)) for x in itertools.combinations(input, i)]
...     combs.extend(els)
...
>>> import pprint
>>> pprint.pprint(combs)
[['a', 'b'],
 ['c', 'd'],
 ['e', 'f'],
 ['a', 'b', 'c', 'd'],
 ['a', 'b', 'e', 'f'],
 ['c', 'd', 'e', 'f'],
 ['a', 'b', 'c', 'd', 'e', 'f']]

答案 1 :(得分:0)

这样一个目标的一个想法是根据一个非常简单的规则将[0..2**n-1]中的整数映射到所有目标元素,其中n是子列表的数量: 如果(2**k)&i!=0我在[0..2**n-1]上运行,则取索引k的元素。换句话说, i 必须按位读取,并且对于每个位集,保留 l 中的相应元素。从数学的角度来看,它是实现你想要做的事情最干净的方法之一,因为它非常紧密地遵循集合各部分的定义(对于具有n个元素的集合,你有完全2**n个部分)。

没有尝试,但这样的事情应该有效:

l = [['a','b'],['c','d'],['e','f']]                                                    
n = len(l)
output = []
for i in range(2**n):
    s = []
    for k in range(n):
        if (2**k)&i: s = s + l[k]
    output.append(s)

如果您不想要空列表,只需将相关行替换为:

for i in range(1,2**n):

答案 2 :(得分:0)

如果您想要所有组合,您可以考虑这种简单的方法:

import itertools

a = [['a','b'],['c','d'],['e','f']]
a = a + [i + j for i in a for j in a if i != j] + [list(itertools.chain.from_iterable(a))]

答案 3 :(得分:0)

有了理解列表:

combs=[sum(x,[]) for i in range(len(l)) for x in itertools.combinations(l,i+1)]