2010-09-29 79 views
2

我有一個長度爲N的列表,此列表中的每個元素都是0或1. 我需要獲取此列表的所有可能組合。這裏是我的代碼:組合列表

def some(lst): 
    result = [] 
    for element in lst: 
     c1 = copy.copy(element) 
     c2 = copy.copy(element) 
     c1.append(0) 
     c2.append(1) 
     result.append(c1)   
     result.append(c2) 
    return result 

def generate(n): 
    if(n == 1): 
     return [[0], [1]] 
    else: 
     return some(generate(n - 1))  

print generate(4) 

我認爲這個任務有更多的pythonic解決方案。 在此先感謝。

回答

5

它們看起來不像位模式(0000 .... 1111),即二進制位。 和N的所有可能的組合二進制位將範圍從0到2 N -1

noOfBits = 5 
for n in range(2**noOfBits): 
    binVal = bin(n)[2:].zfill(noOfBits) 
    b = [ x for x in binVal] 
    print b 

我們是否需要組合數學爲了這個目的?

輸出:

['0', '0', '0', '0', '0'] 
['0', '0', '0', '0', '1'] 
['0', '0', '0', '1', '0'] 
['0', '0', '0', '1', '1'] 
['0', '0', '1', '0', '0'] 
['0', '0', '1', '0', '1'] 
....... 
+1

小改正:改變範圍(0,2 ** noOfBits -1)到範圍(2 ** noOfBits)'。 – 2010-09-29 08:07:43

+0

@Sheldon L. Cooper:+1非常感謝,我將編輯我的答案以糾正 – pyfunc 2010-09-29 08:10:41

+0

謝謝。這就是我需要的。 – demas 2010-09-29 08:18:16

3

itertools模塊裏有許多組合學任務準備發電機。對於你的任務:

list(itertools.product(*noOfBits * ((0, 1),)))