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
我已经打了垃圾桶()函数,但我不是很确定剩下的怎么做。
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
我已经打了垃圾桶()函数,但我不是很确定剩下的怎么做。
你需要的是[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
这是否高效?
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]]
谢谢!这会比我在下面写的循环更有效率吗? – cas5nq
谢谢。在N = 21时,我认为差距呈指数增长。我看着它跑了一分钟,它从未完成。 Itertools在几秒钟内评估。 – cas5nq