2013-02-27 43 views
1

我現在有一個選擇列表的所有可能的唯一組合創建一個新的Python列表:需要與另一個列表

a = ['D1', 
    'C1', 
    'D2', 
    'C2', 
    'D3', 
    'C3', 
    'D4', 
    'C4', 
    'D5', 
    'C5',] 

我想與嵌套列表內可能組合一個新的列表。就像這樣:

b = [ 
'D1', 
'C1', 
'D2', 
'C2', 
'D3', 
'C3', 
'D4', 
'C4', 
'D5', 
'C5', 
['D1', 'C1'], 
['D1', 'D2'], 
['D1', 'C2'] 
. 
. 
['D1', 'C1', 'D2'] 
. 
. 
['D1', 'C1', 'D2', 'C2'] 
. 
. 
['D1', 'C1', 'D2', 'C2', 'D3'] 
: 
etc 
+6

強制性的「你有什麼試過?」。 – XORcist 2013-02-27 17:46:27

+0

嵌套循環和不同的索引片等,似乎不是正確的路徑去:/ – 2013-02-27 17:49:23

+2

http://stackoverflow.com/questions/104420/how-to-generate-all-permutations-of-a-list在python – 2013-02-27 17:49:38

回答

2

退房itertools.combinations

b = [] 
for len_ in xrange(len(a)): 
    b.extend(itertools.combinations(a, len_+1) 

另見迭代工具文檔的powerset recipe

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

我建議使用itertools.permutations(a)

import itertools 
a = ['D1', 
    'C1', 
    'D2', 
    'C2', 
    'D3', 
    'C3', 
    'D4', 
    'C4', 
    'D5', 
    'C5',] 

b = list(itertools.permutations(a)) # this gives permutations of the same length 

如果你想要所有可能的排列(可變長度的),你可以使用一個for循環:

b = [] 
for i in range(1, len(a)+1): 
    b.extend(list(itertools.permutations(a, i))) 

它放入一個列表理解:

b = [list(itertools.permutations(x, i)) for i in range(1, len(x)+1)] 
2

你可以使用itertools.combinations與一個非常高效且相對簡潔的結構list comprehension一起創建一個新列表。但是爲了做到這一點,部分原因是最終列表中並非所有項目本身都是而不是嵌套列表。我實際上懷疑這樣做會讓你稍後難以處理列表,但不管怎麼說,下面是我能夠設計出的最簡單的實現,它可以生成你想要的列表:

from itertools import combinations 

a = ['D1', 'C1', 'D2', 'C2', 'D3', 'C3', 'D4', 'C4', 'D5', 'C5'] 
b = [item for sublist in (list(combo[0] if len(combo) < 2 else list(combo) 
           for combo in combinations(a, n)) 
            for n in range(1, len(a)+1)) for item in sublist] 

from pprint import pprint # print the result 
print 'b = \\' 
pprint(b[:14] + ['... lines omitted ...'] + b[-14:]) 

輸出:

b = \ 
['D1', 
'C1', 
'D2', 
'C2', 
'D3', 
'C3', 
'D4', 
'C4', 
'D5', 
'C5', 
['D1', 'C1'], 
['D1', 'D2'], 
['D1', 'C2'], 
['D1', 'D3'], 
'... lines omitted ...', 
['C1', 'D2', 'D3', 'C3', 'D4', 'C4', 'D5', 'C5'], 
['C1', 'C2', 'D3', 'C3', 'D4', 'C4', 'D5', 'C5'], 
['D2', 'C2', 'D3', 'C3', 'D4', 'C4', 'D5', 'C5'], 
['D1', 'C1', 'D2', 'C2', 'D3', 'C3', 'D4', 'C4', 'D5'], 
['D1', 'C1', 'D2', 'C2', 'D3', 'C3', 'D4', 'C4', 'C5'], 
['D1', 'C1', 'D2', 'C2', 'D3', 'C3', 'D4', 'D5', 'C5'], 
['D1', 'C1', 'D2', 'C2', 'D3', 'C3', 'C4', 'D5', 'C5'], 
['D1', 'C1', 'D2', 'C2', 'D3', 'D4', 'C4', 'D5', 'C5'], 
['D1', 'C1', 'D2', 'C2', 'C3', 'D4', 'C4', 'D5', 'C5'], 
['D1', 'C1', 'D2', 'D3', 'C3', 'D4', 'C4', 'D5', 'C5'], 
['D1', 'C1', 'C2', 'D3', 'C3', 'D4', 'C4', 'D5', 'C5'], 
['D1', 'D2', 'C2', 'D3', 'C3', 'D4', 'C4', 'D5', 'C5'], 
['C1', 'D2', 'C2', 'D3', 'C3', 'D4', 'C4', 'D5', 'C5'], 
['D1', 'C1', 'D2', 'C2', 'D3', 'C3', 'D4', 'C4', 'D5', 'C5']] 
+0

+1我仍然記得在操作系統我得到了你的第一個問題的答案。該問題已被刪除。那次我讀了你曾爲美國國家航空航天局工作過!謝謝。 – 2013-02-27 18:23:12

+1

@GrijeshChauhan:再次問候。是的,聽起來可能是我。感謝您的贊成票。從目前的代表來看,你看起來很快就走得很快。 – martineau 2013-02-28 16:26:48

+0

是的,我完全記得。在Q編寫Python等效的C代碼來生成MD5的模擬序列。函數使用'sin()'&'abs()'問題,因爲缺少英文和格式錯誤而在幾個薄荷內關閉。但是,您在評論中給出了有關bitoverflow的想法。我記得。 :) – 2013-02-28 16:37:00

2

你需要真正發電機組的a這裏是我的解決方案:

def powerset(seq): 
    """ 
    Returns all the subsets of this set. This is a generator. 
    """ 
    if len(seq) <= 1: 
     yield seq 
     yield [] 
    else: 
     for item in powerset(seq[1:]): 
      yield [seq[0]]+item 
      yield item 

a =['D1', 'C1', 'D2', 'C2', 'D3', 'C3', 'D4', 'C4', 'D5', 'C5'] 
b = [x for x in powerset(a)] 
b.sort(key = len) 
for x in b: 
print x 

refrence site:及其工作您可以在codepade here

EDIT看到一個運行的實例。

a =['D1', 'C1', 'D2'] 
b = [x for x in powerset(a)] 
b.sort(key = len) 
for x in b: 
    print x 

,其輸出:

[] 
['D2'] 
['C1'] 
['D1'] 
['C1', 'D2'] 
['D1', 'D2'] 
['D1', 'C1'] 
['D1', 'C1', 'D2'] 

您可以從以下鏈接找到Powerset的Python中更好的代碼。

http://docs.python.org/2/library/itertools.html
http://mail.python.org/pipermail/tutor/2004-April/029413.html
http://ruslanspivak.com/2011/06/09/power-set-generation-a-joy-of-python/

雖然Mr.martineau給予小而快的代碼,但我不明白itertools呢。

相關問題