2017-10-05 47 views
0

我有興趣生成N變量的所有二進制組合,而不必實現在N上迭代N次的手動循環,並且每次循環通過N/2等等。使用itertools生成指數二進制空間

我們在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 

你看,我不在這裏有重複,每個這樣的每個序列都啓用一個變量。我該如何使用Python的itertools

+2

使用[itertools.product](https://docs.python.org /2.7/library/itertools.html#itertools.product)與'repeat'參數 –

+0

@lazydog。這是行不通的,已經嘗試過了。順便說一句,我沒有在這裏重複。例如,應該爲每個序列啓用一次變量「A」。 – Amir

+0

然後,您的_actual_預期產出的例子是什麼?清楚。例如,你桌子裏的'iter1'是否翻譯成'J''? 'iter2'應該代表'IJ'嗎?只是我會成爲輸出的一部分嗎? –

回答

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

然後掩蓋i1 << 9得到的A值,1 << 8B,等下到1 << 0(即1)爲J 。如果目標僅僅是打印出來,你甚至可以得到更聰明,通過二進制字符串化,然後用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' 
+0

謝謝@ShadowRanger更明確。那麼我應該打印(A,...,J)必須具有完整的序列。對? – Amir

+1

@Amir:是的。如果你不需要單獨使用它們,你不必*按*解開它們;對於itertools.product((0,1),repeat = 10)中的位:'後跟'print(* bits)'將產生與解包相同的輸出,並在'print'調用中明確命名它們。 – ShadowRanger

+0

@ShahowRanger,你能解釋一下':010b'在這裏代表什麼? – Amir