2013-03-09 77 views
7

我是python的新手,我正在努力形成多個列表的組合。所以,我有三個(可能更多)看起來像這樣:從多個列表中挑選組合

uk_rock_stars=[1,2,3,4,5,6,7,8,9] 
uk_pop_stars=[10,11,12,13,1,4,6,22,81] 
us_stars=[22,34,44,7,33,99,22,77,99] 
. 
. 

與所有相同長度的列表。現在,我想生成它們的組合列表,其中N是以上列表的總數。我尋找結果看起來像:

comb=[(1,10,22),(1,10,34),(1,10,44)...etc (all combinations)....] 

,使得每個組合,說(1,10,22)是相同的長度原始列表的數目(在此情況下,3)

+0

itertools和類似:http://docs.python.org/2/library/itertools.html?highlight= itertools#itertools.product – squiguy 2013-03-09 00:38:41

回答

12

閱讀在這個http://docs.python.org/2/library/itertools.html#itertools.product,它說明了一切。

itertools是一個包含一堆用於迭代集合的有用功能的包。一個有用的功能是product函數,該函數創建一個生成器,該生成器將遍歷您提供的任意數量的可迭代集合的笛卡爾積。

itertools.product的結果不是一個列表,它是一個生成器。 Python生成器與其他語言的協程相似。這意味着它會根據需要計算您的組合。如果您計算三個迭代的乘積,每個迭代的大小均爲100,但只使用前10個,則itertools.product將只計算10個組合,而不是計算所有100^3個組合。

如果你真的想要一個列表對象而不是一個生成器(也許你想計算切片或其他東西),請調用list函數並將生成器對象作爲參數傳遞。

以下代碼會生成所有組合並打印結果。

代碼:

import itertools 

uk_rock_stars=[1,2,3,4,5,6,7,8,9] 
uk_pop_stars=[10,11,12,13,1,4,6,22,81] 
us_stars=[22,34,44,7,33,99,22,77,99] 

for combination in itertools.product(uk_rock_stars, uk_pop_stars, us_stars): 
    print combination 

輸出:

(1, 10, 22) 
(1, 10, 34) 
(1, 10, 44) 
(1, 10, 7) 
(1, 10, 33) 
(1, 10, 99) 
(1, 10, 22) 
(1, 10, 77) 
(1, 10, 99) 
(1, 11, 22) 
(1, 11, 34) 
(1, 11, 44) 
(1, 11, 7) 
(1, 11, 33) 
(1, 11, 99) 
(1, 11, 22) 
(1, 11, 77) 
(1, 11, 99) 
... 
etc. 
+0

martega:非常感謝。非常清楚。接受你的答案。 – AJW 2013-03-09 00:46:26

2

我認爲這是你在找什麼:

import itertools 
comb = itertools.product(uk_rock_stars, uk_pop_stars, us_stars) 

它會給你一個迭代器對象,它可能會或可能不是你想要的是。將其轉換成一個正常的列表,就用這樣的:

comb = list(comb)