2010-10-25 75 views
1

親愛的所有人, 給定一個變量,例如三個值,我試圖生成這些變量的三元組的所有可能的組合。如何使用python迭代器生成多個變量的笛卡爾積?

儘管此代碼做的伎倆,

site_range=[0,1,2] 
states = [(s0,s1,s2) for s0 in site_range for s1 in site_range for s2 in site_range] 

它有點,嗯,笨拙,只在不斷惡化,如果我嘗試了三個多變量

的組合做同樣的。因此,我的Python 101問題:

  1. 如何使用迭代器重寫上面的代碼?我的意思是,是否可以有一個迭代器來產生上述「狀態」的元素?

  2. 是否有可能擴展這個不僅產生三胞胎,而且還有4人,5人等?

回答

4
import itertools 
site_range=[0,1,2] 
[x for x in itertools.product(site_range, repeat=len(site_range))] 
+0

重新接受你的回答。非常感謝! – 2010-10-25 12:28:25

3

使用itertools.product

>>> site_range=[0,1] 
>>> list(product(site_range, repeat=3)) 
[000 001 010 011 100 101 110 111] 

編輯作爲@Glenn梅納德在評論中指出,這不是笛卡爾乘積。爲此,您必須檢查his answer

+1

這不是[0,1]的笛卡爾乘積,而且代碼甚至沒有運行。另一個錯誤的,未經考驗的答案接受了一個正確的,經過測試的答案...... – 2010-10-25 11:09:13

+0

@Glenn:你說的都對。該代碼只是爲了說明「產品」功能的使用。老實說,例子是從函數的文檔中複製的。 – 2010-10-25 11:13:11

+1

'TypeError:'int'對象不可迭代。您需要使用'repeat = 3'而不是 – 2010-10-25 11:14:03