获取长度为n的所有可能二进制元组的列表

时间:2016-02-10 11:27:02

标签: python tuples itertools

我需要一个函数,它返回长度为 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完成,但我无法弄清楚如何。

2 个答案:

答案 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)