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()函数,但我不太清楚如何做其余的事情。
答案 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]]