簡體   English   中英

給定列表中的項目組合

[英]A Combinations of Items in Given List

我目前在Python領域。 這就是我需要做的。 我已經研究過itertools庫,但它似乎只進行排列。

我想輸入一個輸入列表,例如['yahoo','wikipedia','freebase'],並生成一個項目與零個或多個其他項目的每個唯一組合...

['yahoo', 'wikipedia', 'freebase']
['yahoo', 'wikipedia']
['yahoo', 'freebase']
['wikipedia', 'freebase']
['yahoo']
['freebase']
['wikipedia']

一些注意事項。 順序無關緊要,我正在嘗試設計該方法以采用任意大小的列表。 另外,這種組合是否有名稱?

謝謝你的幫助!

>>> 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')]

PS為什么這個維基?

這稱為電源集。 這是來自itertools docs的實現:

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))

這就是所謂的功率集。 只需遵循此算法即可 這是一個簡單的實現:

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

您基本上是從1到2 n -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']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM