我需要一个函数,它返回长度为 n 的所有可能的二进制元组的列表,如下所示:
binaryTuples(n=2) => [(0,0),(0,1),(1,0),(1,1)]
binaryTuples(n=3) => [(0,0,0),(0,0,1),(0,1,1),(1,1,1) ... and so on]
我知道这可以通过itertools
完成,但我无法弄清楚如何。
答案 0 :(得分:4)
尝试:
itertools.product(*[(0, 1)] * n)
其中n
是所需的大小。
示例:
import itertools
print "For n = 2: " + str(list(itertools.product(*[(0, 1)] * 2)))
print "For n = 3: " + str(list(itertools.product(*[(0, 1)] * 3)))
输出:
For n = 2: [(0, 0), (0, 1), (1, 0), (1, 1)]
For 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)]
您可以直播here。
我受到了generating binary numbers of size n as tuples : itertools.product(*[(0, 1)] * n)的启发,但没有标记为重复,因为它并不完全是您想要的。 ;)
答案 1 :(得分:2)
使用itertools.product
是明智之举。但是,gsamaras`代码可以稍微清理一下:
import itertools
def binary_tuples(w):
return itertools.product((0, 1), repeat=w)
print(list(binary_tuples(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)]
在这里,只是为了好玩,如何使用str.format
方法来完成它,它可以格式化二进制的整数。诀窍是将所需的bitstring长度传递给格式规范字符串。
此代码在Python 2.6及更高版本上运行,但更高版本可以简化格式规范字符串。当然,在Python 3上,您需要将xrange
更改为range
。
def binary_tuples(w):
return [tuple(int(d) for d in '{0:0{1}b}'.format(i, w))
for i in xrange(1<<w)]
print(binary_tuples(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)]
这是一个发电机版本:
def binary_tuples_gen(w):
for i in xrange(1<<w):
yield tuple(int(d) for d in '{0:0{1}b}'.format(i, w))
for t in binary_tuples_gen(3):
print(t)
<强>输出强>
(0, 0, 0)
(0, 0, 1)
(0, 1, 0)
(0, 1, 1)
(1, 0, 0)
(1, 0, 1)
(1, 1, 0)
(1, 1, 1)