给定列表的项组合
我现在在使用Python。下面是我需要做的事情。我已经查看过itertools库,但它似乎只处理排列。
我想从一个输入列表,比如['yahoo', 'wikipedia', 'freebase'],生成每个独特的组合,组合中包含一个项目和零个或多个其他项目……
['yahoo', 'wikipedia', 'freebase']
['yahoo', 'wikipedia']
['yahoo', 'freebase']
['wikipedia', 'freebase']
['yahoo']
['freebase']
['wikipedia']
几点说明。顺序不重要,我想设计一个方法,可以处理任何大小的列表。另外,这种组合有没有专门的名称呢?
谢谢你的帮助!
4 个回答
0
你基本上是在用二进制从1数到2n-1:
0 0 1 ['freebase']
0 1 0 ['wikipedia']
0 1 1 ['wikipedia', 'freebase']
1 0 0 ['yahoo']
1 0 1 ['yahoo', 'freebase']
1 1 0 ['yahoo', 'wikipedia']
1 1 1 ['yahoo', 'wikipedia', 'freebase']
3
这个叫做“幂集”。下面是来自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))
3
>>> l = ['yahoo', 'wikipedia', 'freebase']
>>> import itertools
>>> for i in range(1, len(l) +1):
print(list(itertools.combinations(l, r=i)))
[('yahoo',), ('wikipedia',), ('freebase',)]
[('yahoo', 'wikipedia'), ('yahoo', 'freebase'), ('wikipedia', 'freebase')]
[('yahoo', 'wikipedia', 'freebase')]
顺便问一下,为什么这是个维基呢?