使用itertools生成指数二进制空间

时间:2017-10-05 21:19:48

标签: python python-2.7 itertools

我感兴趣的是生成N变量的所有二进制组合,而不必实现在N上迭代N次并且每次循环遍历N/2的手动循环,依此类推。

我们在python中有这样的功能吗?

E.g:

我有N个二进制变量:

pool=['A','B','C',...,'I','J']
len(pool)=10

我想从这些中生成2^10=1024空格,例如:

          [A B C ... I J]
iter0    = 0 0 0 ... 0 0
iter1    = 0 0 0 ... 0 1
iter2    = 0 0 0 ... 1 1
...
iter1022 = 1 1 1 ... 1 0
iter1023 = 1 1 1 ... 1 1

你知道我在这里没有重复,每个变量都按照这些序列启用一次。我怎么能用Python itertools

来做到这一点

1 个答案:

答案 0 :(得分:3)

itertools.product with the repeat parameter是最简单的答案:

for A, B, C, D, E, F, G, H, I, J in itertools.product((0, 1), repeat=10):

每个变量的值将在右侧循环最快,在左侧最慢,因此您将获得:

0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 1 1
0 0 0 0 0 0 0 1 0 0

等。这可能是您可以识别的:它只是递增10位数的二进制表示。根据您的需要,您可能真的想要做:

for i in range(1 << 10):

然后使用i屏蔽1 << 9以获取A的{​​{1}},1 << 8的{​​{1}}值,依此类推至B1 << 01J。如果目标只是打印它们,你甚至可以通过二进制字符串化,然后使用join插入分隔符来更聪明:

for i in range(1 << 10):
    print(' '.join('{:010b}'.format(i)))
    # Or letting print insert the separator:
    print(*'{:010b}'.format(i)) # If separator isn't space, pass sep='sepstring'