【问题标题】:Python : efficient bytearray incrementationPython:高效的字节数组增量
【发布时间】:2013-04-22 16:29:00
【问题描述】:

如何在 Python 中迭代 bytearray of length = n 的所有可能值? 在最坏的情况下n <= 40bytes

例如,迭代n = 4

00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000001
00000000 00000000 00000000 00000010

.
.
.
.

11111111 11111111 11111111 11111110
11111111 11111111 11111111 11111111

【问题讨论】:

  • 最坏情况 n 可能是 8; 2^64 纳秒 = 585 年
  • @JasonS:时间不变!大声笑
  • 我不需要所有组合 :) 我只需要提示如何实现它 - 实际使用会有点不同。
  • 最好在数学上一一完成。所有组合的 2^320 是很多组合。多年的时间和所有计算机的所有内存等... 2^320 是2135987035920910082395021706169552114602704522356652769947041607822219725780640550022962086936576 数字...
  • 是的@MartinV。您如何期望达到2135987035920910082395021706169552114602704522356652769947041607822219725780640550022962086936576 的最坏情况?

标签: python math binary


【解决方案1】:

你可以使用itertools.product:

In [11]: from itertools import product

In [15]: for x in product('01',repeat=4): #for your n=4 change repeat to 32 
    print "".join(x)
   ....:     
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111

【讨论】:

  • Thats great thank you. I am just reading http://docs.python.org/2/library/itertools.html#itertools.product and its 真的很酷。
【解决方案2】:

灵感来自https://stackoverflow.com/a/15538456/1219006

n = 2
[[[i>>k&1 for k in range(j, j-8, -1)] for j in range(8*n-1, 0, -8)] 
 for i in range(2**(8*n))]

您需要在 Python 3 上为大 n 运行此程序,因为 xrange 不支持大整数。

作为生成器:

def byte_array(n):
    for i in range(2**(8*n)):
        yield [[i>>k&1 for k in range(j, j-8, -1)] for j in range(8*n-1, 0, -8)]

>>> i = byte_array(4)
>>> next(i)
[[0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0]]
>>> next(i)
[[0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1]]

或者,如果您不想将它们分组,则更简单:

[[i>>j&1 for j in range(8*n-1, -1, -1)] for i in range(2**(8*n))]

等效生成器:

def byte_array(n):
    for i in range(2**(8*n)):
        yield [i>>j&1 for j in range(8*n-1, -1, -1)]

【讨论】:

  • 干得好,可以从您的代码中学到很多东西。我正在处理一项加密挑战,并且在少数任务中我需要迭代非常窄的字节数组间隔(分组),所以我想知道更一般的情况 - “如何迭代所有组合......”。我知道一个一个地迭代几乎需要以太:)
猜你喜欢
  • 2017-12-11
  • 2017-12-28
  • 2019-11-13
  • 1970-01-01
  • 1970-01-01
  • 2016-06-16
  • 2015-09-30
  • 1970-01-01
  • 2015-07-22
相关资源
最近更新 更多