需要从另一个列表创建所有可能的唯一组合的新Python列表
我现在有一个选择的列表:
a = ['D1',
'C1',
'D2',
'C2',
'D3',
'C3',
'D4',
'C4',
'D5',
'C5',]
我想要一个新的列表,里面包含可能组合的嵌套列表。像这样:
b = [
'D1',
'C1',
'D2',
'C2',
'D3',
'C3',
'D4',
'C4',
'D5',
'C5',
['D1', 'C1'],
['D1', 'D2'],
['D1', 'C2']
.
.
['D1', 'C1', 'D2']
.
.
['D1', 'C1', 'D2', 'C2']
.
.
['D1', 'C1', 'D2', 'C2', 'D3']
:
etc
4 个回答
2
可以看看这个链接:itertools.combinations
,这里介绍了一个叫做组合的工具。
b = []
for len_ in xrange(len(a)):
b.extend(itertools.combinations(a, len_+1)
另外,还可以参考一下来自itertools文档的幂集示例:
def powerset(iterable):
"powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
s = list(iterable)
return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))
2
你需要的是集合的所有子集,这里是我的解决方案:
def powerset(seq):
"""
Returns all the subsets of this set. This is a generator.
"""
if len(seq) <= 1:
yield seq
yield []
else:
for item in powerset(seq[1:]):
yield [seq[0]]+item
yield item
a =['D1', 'C1', 'D2', 'C2', 'D3', 'C3', 'D4', 'C4', 'D5', 'C5']
b = [x for x in powerset(a)]
b.sort(key = len)
for x in b:
print x
我的参考网站:它可以正常工作,你可以在codepad上查看
编辑:这是运行的一个实例。
a =['D1', 'C1', 'D2']
b = [x for x in powerset(a)]
b.sort(key = len)
for x in b:
print x
它的输出结果是:
[]
['D2']
['C1']
['D1']
['C1', 'D2']
['D1', 'D2']
['D1', 'C1']
['D1', 'C1', 'D2']
你可以通过以下链接找到更好的Python子集生成代码。
http://docs.python.org/2/library/itertools.html
http://mail.python.org/pipermail/tutor/2004-April/029413.html
http://ruslanspivak.com/2011/06/09/power-set-generation-a-joy-of-python/
虽然Mr. martineau提供了一个小而快的代码,但我还不太理解itertools。
2
你可以使用 itertools.combinations
来创建一个新的列表,配合一个叫做 列表推导式 的高效且相对简洁的写法。不过,这样做有点复杂,部分原因是最终列表中的并不是所有项都是嵌套列表。我其实怀疑这样做会让你后续处理这个列表变得更困难。不过,不管怎样,这里是我能想到的最简单的实现方式,它能准确生成你想要的列表:
from itertools import combinations
a = ['D1', 'C1', 'D2', 'C2', 'D3', 'C3', 'D4', 'C4', 'D5', 'C5']
b = [item for sublist in (list(combo[0] if len(combo) < 2 else list(combo)
for combo in combinations(a, n))
for n in range(1, len(a)+1)) for item in sublist]
from pprint import pprint # print the result
print 'b = \\'
pprint(b[:14] + ['... lines omitted ...'] + b[-14:])
输出:
b = \
['D1',
'C1',
'D2',
'C2',
'D3',
'C3',
'D4',
'C4',
'D5',
'C5',
['D1', 'C1'],
['D1', 'D2'],
['D1', 'C2'],
['D1', 'D3'],
'... lines omitted ...',
['C1', 'D2', 'D3', 'C3', 'D4', 'C4', 'D5', 'C5'],
['C1', 'C2', 'D3', 'C3', 'D4', 'C4', 'D5', 'C5'],
['D2', 'C2', 'D3', 'C3', 'D4', 'C4', 'D5', 'C5'],
['D1', 'C1', 'D2', 'C2', 'D3', 'C3', 'D4', 'C4', 'D5'],
['D1', 'C1', 'D2', 'C2', 'D3', 'C3', 'D4', 'C4', 'C5'],
['D1', 'C1', 'D2', 'C2', 'D3', 'C3', 'D4', 'D5', 'C5'],
['D1', 'C1', 'D2', 'C2', 'D3', 'C3', 'C4', 'D5', 'C5'],
['D1', 'C1', 'D2', 'C2', 'D3', 'D4', 'C4', 'D5', 'C5'],
['D1', 'C1', 'D2', 'C2', 'C3', 'D4', 'C4', 'D5', 'C5'],
['D1', 'C1', 'D2', 'D3', 'C3', 'D4', 'C4', 'D5', 'C5'],
['D1', 'C1', 'C2', 'D3', 'C3', 'D4', 'C4', 'D5', 'C5'],
['D1', 'D2', 'C2', 'D3', 'C3', 'D4', 'C4', 'D5', 'C5'],
['C1', 'D2', 'C2', 'D3', 'C3', 'D4', 'C4', 'D5', 'C5'],
['D1', 'C1', 'D2', 'C2', 'D3', 'C3', 'D4', 'C4', 'D5', 'C5']]