2010-04-06 92 views
2

我目前在Python土地。這是我需要做的。我已經看過itertools庫,但它似乎只做排列。給定列表中的項目組合

我要帶出的輸入表,如[「雅虎」,「維基百科」,「遊離鹼」],併產生與其他零個或多個項目一個項目的每一個獨特的組合...

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

幾個筆記。順序無關緊要,我試圖設計方法來取任何大小的列表。另外,這種組合有沒有名稱?

感謝您的幫助!

回答

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

附:爲什麼這個wiki?

0

這就是所謂的功率集。只需按照此algorithm。這裏有一個簡單的實現:

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 
0

你基本上從1數到2 ň -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'] 
+0

有趣的方法來解決這個問題。我絕對不會這樣想。 – 2010-04-06 21:06:10

3

它被稱爲冪。這是一個執行從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))