我有列表,如清單:
[[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,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中的列表理解如何工作。有任何想法嗎?
謝謝。
你的目錄列表(笑),然後從列表列表彈出第一個項目,使笛卡爾乘積與連擊剩下的列表:
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)]
函數式編程中所需的基本機制叫zip
。從Haskell Prelude:
zip
取兩個列表並返回相應對的列表。如果一個輸入列表很短,則放棄較長列表中的多餘元素。
還有一個built-in zip() function in Python that does essentially the same thing。
僅使用大列表理解的解決方案是:
警告:僅供列表理解愛好者
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)]
很整潔! + 1 – Duke 2011-12-28 19:01:48
你能解釋一下上面的sum([],[])是如何工作的嗎?找不到任何文檔。謝謝 – Duke 2012-04-16 05:29:54
'sum'中的第二個參數就像初始值。然後,它開始使用'+ ='將第一個參數中的所有元素添加到(初始值)。這就是爲什麼'sum([[1,2],[3]],[6])返回'[6,1,2,3]'('[6] + [1,2] + [3]' ) – juliomalegria 2012-04-25 20:15:37
不破壞原有名單:
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))))
整齊。我不得不在以前做一個deepcopy :-) – Duke 2011-12-29 21:14:32
哪種語言,Python的? – 2011-12-28 17:11:20
這是功課嗎?你試過什麼了? – 2011-12-28 17:13:08
是的我正在使用python – Duke 2011-12-28 17:13:14