Python 给定列表中项目的组合
我现在在蟒蛇之地。这就是我需要做的。我已经查看了itertools库,但它似乎只进行排列 我想获取一个输入列表,比如['yahoo'、'wikipedia'、'freebase'],并生成一个项目与零个或多个其他项目的每个唯一组合Python 给定列表中项目的组合,python,permutation,combinations,Python,Permutation,Combinations,我现在在蟒蛇之地。这就是我需要做的。我已经查看了itertools库,但它似乎只进行排列 我想获取一个输入列表,比如['yahoo'、'wikipedia'、'freebase'],并生成一个项目与零个或多个其他项目的每个唯一组合 ['yahoo', 'wikipedia', 'freebase'] ['yahoo', 'wikipedia'] ['yahoo', 'freebase'] ['wikipedia', 'freebase'] ['yahoo'] ['freebase'] ['wik
['yahoo', 'wikipedia', 'freebase']
['yahoo', 'wikipedia']
['yahoo', 'freebase']
['wikipedia', 'freebase']
['yahoo']
['freebase']
['wikipedia']
一些注释。顺序并不重要,我正在尝试设计一种方法来获取任意大小的列表。还有,这种组合有名字吗
谢谢你的帮助 这称为功率集。照这个做就行了。下面是一个简单的实现:
def powerset(seq):
if len(seq):
head = powerset(seq[:-1])
return head + [item + [seq[-1]] for item in head]
else:
return [[]]
>>> powerset(['yahoo', 'wikipedia', 'freebase'])
[[], ['yahoo'], ['wikipedia'], ['yahoo', 'wikipedia'], ['freebase'], ['yahoo', 'freebase'], ['wikipedia', 'freebase'], ['yahoo', 'wikipedia', 'freebase']]
还有一个:
def powerset(s):
sets = []
indicator = lambda x: x & 1
for element in xrange(2**len(s)):
n = element
subset = []
for x in s:
if indicator(n):
subset.append(x)
n >>= 1
sets.append(subset)
return sets
还有,为什么这个wiki?你基本上是在用二进制从1数到2n-1:
这叫做动力装置。这是从以下方面实施的:
解决这个问题的有趣方法。我绝对不会这样想。
>>> 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')]
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']
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))