如何生成二进制powersets?

时间:2015-11-10 22:40:15

标签: python set

N = 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)]

这需要适用于任何N,最好至少20。

我玩过bin()函数,但我不太清楚如何做其余的事情。

3 个答案:

答案 0 :(得分:4)

你需要的是[0, 1]的“第N个笛卡尔幂”。这是通过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

答案 1 :(得分: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)]

答案 2 :(得分: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]]