2016-02-13 91 views
0

比方說,我有這個名單有3個項目,每個項目包含3個項目:操縱在Python大名單

list = [ [1,2,3], [4,5,6], [7,8,9] ] 

我想創建一個包含所有3 ** 2 = 9列表的項目,這意味着(X,Y,Z),其中x在[1,4,7],Y在[2,5,8]和z在[3,6,9]

組合的組合,因此,我將使用列表理解這樣的:

new_list =[(x,y,z) for x in [1,2,3] for y in [4,5,6] for z in [7,8,9]] 

這是一種「手動」方法。但是如果我想在我的代碼中使用每次長度不一的大型列表,我們假設一個20D列表(20個項目,每個項目包含20個項目),我如何創建一個通用類型的代碼?

回答

4

您可以使用itertools.product,但結果將是3 = 27項:

>>> from itertools import product 
>>> lst = [ [1,2,3], [4,5,6], [7,8,9] ] 
>>> 
>>> list(product(*lst)) 
[(1, 4, 7), (1, 4, 8), (1, 4, 9), (1, 5, 7), (1, 5, 8), (1, 5, 9), (1, 6, 7), (1, 6, 8), (1, 6, 9), (2, 4, 7), (2, 4, 8), (2, 4, 9), (2, 5, 7), (2, 5, 8), (2, 5, 9), (2, 6, 7), (2, 6, 8), (2, 6, 9), (3, 4, 7), (3, 4, 8), (3, 4, 9), (3, 5, 7), (3, 5, 8), (3, 5, 9), (3, 6, 7), (3, 6, 8), (3, 6, 9)] 

注意,當你在處理大數據集,你並不需要的結果列表轉換。由於product返回一個迭代器,因此您可以簡單地循環顯示產品和訪問項目。

+0

這就是我正在尋找的,你對結果是正確的,那就是3 ** 3 = 27。 – user3060854