2010-09-29 77 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),)))