2015-11-10 30 views
1
N = 3 

所需的输出:如何生成二进制powersets?

[(0,0,0), (0,0,1), (0,1,0), (0,1,1), (1,0,0), (1,0,1), (1,1,0), (1,1,1)] 

这需要为任意N型工作,优选高达至少20

我已经打了垃圾桶()函数,但我不是很确定剩下的怎么做。

回答

4

你需要的是[0, 1]的“第笛卡尔能量”。这与itertools.product实现:

In [1]: from itertools import product 

In [2]: N = 3 

In [3]: list(product([0, 1], repeat=N)) 
Out[3]: 
[(0, 0, 0), 
(0, 0, 1), 
(0, 1, 0), 
(0, 1, 1), 
(1, 0, 0), 
(1, 0, 1), 
(1, 1, 0), 
(1, 1, 1)] 

至于效率,这里有一个简单的时间比较(我修改你的函数返回一个列表,因为我测试上的Python 3):

In [9]: %timeit x = prod(3) 
100000 loops, best of 3: 3.96 µs per loop 

In [10]: %timeit x = S(3) 
100000 loops, best of 3: 18.2 µs per loop 
+0

谢谢!这会比我在下面写的循环更有效率吗? – cas5nq

+0

谢谢。在N = 21时,我认为差距呈指数增长。我看着它跑了一分钟,它从未完成。 Itertools在几秒钟内评估。 – cas5nq

3

的Python 2溶液

import itertools list(itertools.product([0, 1], repeat=3))

输出

[(0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1), (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1)]

+0

谢谢!这会比我在下面写的循环更有效率吗? – cas5nq

+1

更高效:可能。更可读:绝对。 –

+2

远为有效。使用用户定义的函数的'map'相对较慢,并且每次调用传递给嵌套的'map'时,用户定义的函数都会定义一个新函数。 – chepner

1

这是否高效?

def S(N): 
    return map(lambda m: map(lambda n: int(('{0:0' + str(N) + 'b}').format(m)[n]), range(N)), range(2**N)) 

print S(2) 
> [[0, 0], [0, 1], [1, 0], [1, 1]] 
print S(3) 
> [[0, 0, 0], [0, 0, 1], [0, 1, 0], [0, 1, 1], [1, 0, 0], [1, 0, 1], [1, 1, 0], [1, 1, 1]] 
print S(4) 
> [[0, 0, 0, 0], [0, 0, 0, 1], [0, 0, 1, 0], [0, 0, 1, 1], [0, 1, 0, 0], [0, 1, 0, 1], [0, 1, 1, 0], [0, 1, 1, 1], [1, 0, 0, 0], [1, 0, 0, 1], [1, 0, 1, 0], [1, 0, 1, 1], [1, 1, 0, 0], [1, 1, 0, 1], [1, 1, 1, 0], [1, 1, 1, 1]] 
相关问题