如何压扁大型循环堆栈?

时间:2012-02-09 21:43:00

标签: python loops iteration

假设我想得到三个二进制数字的所有可能组合,即:

0,0,0
0,0,1
0,1,0
0,1,1
1,0,0
1,0,1
1,1,0
1,1,1

我可以这样做:

p = []
for a in range(2):
    for b in range(2):
        for c in range(2):
           p.append([a,b,c])

print p

但是,如果我想定义一个返回n个二进制数字的可能性的函数呢?即如何动态堆叠for循环?

4 个答案:

答案 0 :(得分:5)

from itertools import product
product(range(2), repeat=3)

答案 1 :(得分:4)

答案 2 :(得分:2)

没有itertools解决方案。

def binarydigits(n):
    if n == 1:
        yield (0,)
        yield (1,)
    else:
        for i in binarydigits(n-1):
            for j in binarydigits(1):
                yield i+j

答案 3 :(得分:2)

你真的只需要一个循环用于你的特定情况,因为你想要的0和1的序列表示连续的整数:

def allbinary(ndigits):
    for n in xrange(2 ** ndigits):
        yield map(int, bin(n)[2:].zfill(ndigits))

for x in allbinary(8): print x

请注意,map()会生成一个列表而不是一个元组,但如果您需要这个元组,则可以将其转换为元组。

但是,在大多数情况下,其他人推荐的itertools.product是更好的解决方案,包括这个。