给定列表的项组合

2 投票
4 回答
1104 浏览
提问于 2025-04-15 21:18

我现在在使用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')]

顺便问一下,为什么这是个维基呢?

撰写回答