用itertools生成指数二进制sp

2024-03-28 15:03:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我对生成N变量的所有二进制组合感兴趣,而不必实现手动循环,即在N上迭代N次,每次在N/2上循环等等。你知道吗

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

例如:

我有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

你看,我这里没有重复,每个变量在每个iter序列中启用一次。如何使用Python的itertools实现这一点?你知道吗


Tags: 功能len二进制空间序列手动感兴趣pool
1条回答
网友
1楼 · 发布于 2024-03-28 15:03:11

^{} with the ^{} 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):

然后用1 << 9屏蔽i,得到A1 << 8的值,依此类推,直到1 << 0(即1)的值。如果目标只是打印它们,您甚至可以通过二进制字符串化,然后使用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'

相关问题 更多 >