2015-05-14 70 views
8

每個項目我有一本字典:循環在列表

mydict = {'item1':[1,2,3],'item2':[10,20,30]} 

我要創建兩個的笛卡爾積,使我得到每個可能的元組。

output: [(1,10),(1,20),(1,30), 
     (2,10),(2,20),(2,30), 
     (3,10),(3,20),(3,30)] 

這似乎是這樣,如果我有三個項目,延續將有一個簡單的方法來做到這一點。有點像循環的動態數量。感覺就像我缺少一個明顯的方式做到這一點...

回答

12

itertools.product()功能會做到這一點:

>>> import itertools 
>>> mydict = {'item1':[1,2,3],'item2':[10,20,30]} 
>>> list(itertools.product(*mydict.values())) 
[(10, 1), (10, 2), (10, 3), (20, 1), (20, 2), (20, 3), (30, 1), (30, 2), (30, 3)] 

如果你需要控制所產生的元組的順序,你可以做

itertools.product(mydict['item1'], mydict['item2']) 
+0

花了你2秒。很好,謝謝! – Chris

2

您也可以蠻力它使用兩個循環

mydict = {'item1':[1,2,3],'item2':[10,20,30]} 

x = [] 
for i in mydict['item1']: 
    for j in mydict['item2']: 
     x.append((i,j)) 

所有該類別中Öde的作用是遍歷mydict['item1']中的所有項目,然後通過mydict['item2']中的每個項目,然後將每個項目添加到新列表中。

它會給你這樣的結果:

[(1, 10), (1, 20), (1, 30), (2, 10), (2, 20), (2, 30), (3, 10), (3, 20), (3, 30)] 
0

你可以做兩個for循環。 - 第一個會跟蹤第一個項目列表的索引位置。 - 第二個循環會遍歷第二個循環中的每個項目。 - 它貫穿所有項目後,第一個for循環將遞增到其列表中的下一個項目和第二循環將通過第二列表再次運行等

+0

這正是我在[我的回答]中所做的(http://stackoverflow.com/a/30228048/4087357) – michaelpri