2013-04-29 67 views
3

如何在Python中迭代bytearray of length = n的所有可能值? 在最壞的情況下n <= 40bytesPython:高效的bytearray增量

例如,對於迭代n = 4

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

. 
. 
. 
. 

11111111 11111111 11111111 11111110 
11111111 11111111 11111111 11111111 
+1

最壞的情況n大概是8; 2^64納秒= 585年 – 2013-04-29 04:48:10

+1

@JasonS:這是恆定的時間!大聲笑 – Mehrdad 2013-04-29 04:49:34

+0

我不需要所有的組合:)我只需要提示如何實現 - 實際使用情況會有所不同。 – 2013-04-29 04:52:28

回答

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))] 

你需要運行t他對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)] 
+0

偉大的工作,可以從你的代碼中學到很多東西。我正在研究一個加密挑戰,並且我需要迭代非常窄的bytearrays區間(分組),所以我想知道更常見的情況 - 「如何迭代所有組合...」。我知道這將需要幾乎ethernity迭代一個:) – 2013-04-29 22:22:27

4

您可以使用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 
+2

是的,然後等待。 :-) – 2013-04-29 04:51:31

+1

非常感謝你。我只是閱讀http://docs.python.org/2/library/itertools.html#itertools.product,它真的很酷。 – 2013-04-29 04:55:12