2013-02-03 28 views
1

這是非常基本的,但我不知道它會發生什麼。PYTHON - 從一系列多種選擇中輸出每種可能的結果?

假設我有一個「選擇」列表作爲輸入。例如:

c = [2,3,2] 

這表示3個選項,包含2個選項,3個選項,然後是2個選項。作爲一個輸出,我需要像這樣:

[1,1,1] 
[1,1,2] 
[1,2,1] 
[1,2,2] 
[1,3,1] 
[1,3,2] 
[2,1,1] 
[2,1,2] 
[2,2,1] 
[2,2,2] 
[2,3,1] 
[2,3,2] 

所以每個選擇的排列。我知道如果每次選擇相同數量的選擇(例如3),我會怎麼做,但我需要它爲任何數量的選擇工作。毫無疑問,這個問題之前已經提出過,但我正在尋找的術語並沒有改變任何事情。

回答

4

這可以用itertools.product()完成和list comprehension

>>> list(itertools.product(*[range(1, j+1) for j in c])) 
[(1, 1, 1), (1, 1, 2), (1, 2, 1), (1, 2, 2), (1, 3, 1), (1, 3, 2), (2, 1, 1), (2, 1, 2), (2, 2, 1), (2, 2, 2), (2, 3, 1), (2, 3, 2)] 

我們遍歷列表,並創建代表每一列的潛力值的範圍。

>>> [range(1, j+1) for j in c] 
[range(1, 3), range(1, 4), range(1, 3)] 

(我用3.x和range()給出了一個發電機,在2.x中,這將是一個清單,如:[[1, 2], [1, 2, 3], [1, 2]],它仍然可以正常工作 - 因爲你在這裏消費也無妨,它不是除非你特別喜歡,否則在2.x中值得使用xrange())。

然後我們將其解壓到itertools.product(),它給了我們所有可能的組合,這就是你想要的。

+0

那很簡單。我並不瞭解itertools的產品功能,現在我已經做了演示。謝謝。 – user2036366