2011-12-28 59 views
1

我有列表,如清單:
[[1,2,3],[4,5,6],[7,8,9]] 我試圖創建表格的元組(1,4),(1,5),(1,6),(1,7),(1,8),(1,9),(2,4),(2,5),(4,7),(4,8),...遞歸創建列表元組

換句話說,在第一列表中的項目應與項目的元組在隨後的列表中,第二個列表中的項目,來自其後續列表的項目的元組等等,直到我們到達最後一個列表。

我有點不確定在Python中的列表理解如何工作。有任何想法嗎?

謝謝。

+1

哪種語言,Python的? – 2011-12-28 17:11:20

+0

這是功課嗎?你試過什麼了? – 2011-12-28 17:13:08

+0

是的我正在使用python – Duke 2011-12-28 17:13:14

回答

3

你的目錄列表(笑),然後從列表列表彈出第一個項目,使笛卡爾乘積與連擊剩下的列表:

import itertools 
lol = [[1,2,3],[4,5,6],[7,8,9]] 
result = list() 
while lol: 
    l=lol.pop(0) 
    o=itertools.chain(*lol) 
    result += itertools.product(l,o) 

結果 [(1,4),(1 (1,7),(1,8),(1,9),(2,4),(2,5),(2,6),(2,7), ),(2,8),(2,9),(3,4),(3,5),(3,6),(3,7),(3,8),(3,9), (4,7),(4,8),(4,9),(5,7),(5,8),(5,9),(6,7),(6,8),(6 ,9)]

+0

哈哈,謝謝。 +1爲簡明 – Duke 2011-12-28 17:27:51

+0

歡迎您,哈哈。 – danihp 2012-01-04 22:05:03

0

函數式編程中所需的基本機制叫zip。從Haskell Prelude

zip取兩個列表並返回相應對的列表。如果一個輸入列表很短,則放棄較長列表中的多餘元素。

還有一個built-in zip() function in Python that does essentially the same thing

+0

我將如何實現? – Duke 2011-12-28 17:12:55

+0

嵌入到Python:http://docs.python.org/library/functions.html#zip – sczizzo 2011-12-28 17:14:15

+0

好吧,我會看看如果我可以得到這個工作超過兩個列表。 – Duke 2011-12-28 17:18:07

1

僅使用大列表理解的解決方案是:

警告:僅供列表理解愛好者

sum([[(elem,e) for e in sum(my_lists[i+1:], [])] for i,my_list in enumerate(my_lists[:-1]) for j,elem in enumerate(my_list)], []) 

結果:

[(1, 4), (1, 5), (1, 6), (1, 7), (1, 8), (1, 9), (2, 4), (2, 5), (2, 6), (2, 7), (2, 8), (2, 9), (3, 4), (3, 5), (3, 6), (3, 7), (3, 8), (3, 9), (4, 7), (4, 8), (4, 9), (5, 7), (5, 8), (5, 9), (6, 7), (6, 8), (6, 9)] 
+0

很整潔! + 1 – Duke 2011-12-28 19:01:48

+0

你能解釋一下上面的sum([],[])是如何工作的嗎?找不到任何文檔。謝謝 – Duke 2012-04-16 05:29:54

+0

'sum'中的第二個參數就像初始值。然後,它開始使用'+ ='將第一個參數中的所有元素添加到(初始值)。這就是爲什麼'sum([[1,2],[3]],[6])返回'[6,1,2,3]'('[6] + [1,2] + [3]' ) – juliomalegria 2012-04-25 20:15:37

1

不破壞原有名單:

from itertools import chain, product 
lol = [[1,2,3],[4,5,6],[7,8,9]] 
list(chain(*(product(item, chain(*lol[index+1:])) for index, item in enumerate(lol)))) 
+0

整齊。我不得不在以前做一個deepcopy :-) – Duke 2011-12-29 21:14:32