2014-01-07 11 views
3

我想在列表中遍歷0和1的每個可能的組合。例如,如果我用3個參數的工作,我會得到:在Python中使用0和1的每個可能的組合列出一個列表

[0, 0, 0], [0, 0, 1], [0, 1, 0], [1, 0, 0], [1, 1, 0], [1, 0, 1], [0, 1, 1], [1, 1, 1] 

我以爲解決方案上Array combinations of 0s and 1s由於與存儲我需要長度的二進制數的問題是不夠的。我希望能夠像這樣遍歷20個或更多長度的列表,其中純粹大小變得難以用整數處理。我一直在使用這樣的代碼:

for a in [0, 1]: 
    for b in [0, 1]: 
     for c in [0, 1]: 
      print([a, b, c]) 

有什麼更Python或快?一個20層嵌套的循環,即使是像這樣簡單的循環,仍然是一個怪物。

+2

「由於與長度的存儲二進制數的問題我需要」。什麼? Python可以很容易地存儲遠遠大於它可以計算的最大值的整數,這個值等於宇宙的年齡。只需從'0'開始並繼續。這種方法在Python中唯一的問題是,將這些整數轉換爲數字列表可能比使用itertools.product代替速度慢。 –

+0

「20或更多」 - 甚至像C這樣的語言可以用整數處理,沒有問題,並且這些語言具有固定大小的整數。 – user2357112

回答

13

使用itertools.product

import itertools 

for numbers in itertools.product([0, 1], repeat=3): 
    print(numbers) 

輸出:

(0, 0, 0) 
(0, 0, 1) 
(0, 1, 0) 
(0, 1, 1) 
(1, 0, 0) 
(1, 0, 1) 
(1, 1, 0) 
(1, 1, 1) 
2

您正在尋找cartesian product

對於少數的笛卡爾乘積,則可以使用這種類型的列表理解的:

>>> [(a,b,c) for a in (0,1) for b in (0,1) for c in (0,1)] 
[(0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1), (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1)] 

超過數(比如說超過4),你應該使用falsetru's方法更多。

2

另一種選擇,你可以指望了二進制:

['{:03b}'.format(x) for x in range(8)] 
Out[10]: ['000', '001', '010', '011', '100', '101', '110', '111'] 

如果你真正需要它們是列表:

[list('{:03b}'.format(x)) for x in range(8)] 
Out[12]: 
[['0', '0', '0'], 
['0', '0', '1'], 
['0', '1', '0'], 
['0', '1', '1'], 
['1', '0', '0'], 
['1', '0', '1'], 
['1', '1', '0'], 
['1', '1', '1']] 
相關問題