2016-10-01 10 views
2

我有以下問題:如何迭代不同列表的產品?

我有一個列表l1,我想與功能itertools.product遍歷產品,我也想在同樣的方式,第二個列表l2

例如:

l1 = [1, 2, 3, 4] 
l2 = ['a', 'b', 'c', 'd'] 
for i in list(itertools.product(l1, repeat = 2)): 
    print(i) 

輸出是:

(1, 1) 
(1, 2) 
... 

我覺得這是很清楚的。但我怎麼能管理,包括第二個列表,並獲得類似這樣的輸出:

(1, a),(1, a) 
(1, a),(2, b) 
(1, a),(3, c) 
(1, a),(4, d) 

(2, b),(1, a) 
(2, b),(2, b) 
(2, b),(3, c) 
(2, b),(4, d) 

(3, c),(1, a) 
(3, c),(2, b) 
(3, c),(3, c) 
(3, c),(4, d) 

(4, d),(1, a) 
(4, d),(2, b) 
(4, d),(3, c) 
(4, d),(4, d) 

我知道一個適當的解決辦法是for循環結合起來。但這並不適合我,因爲我想增加repeat-計數器。

回答

3

通過提供名單的zipproduct:不需要在list

for i in product(zip(l1,l2), repeat = 2): 
    print(i) 

包裝,for循環對當前迭代器在調用next的照顧。

如果你想換行,每4個組合,使用enumerate(從1開始),並添加一個\nc % 40

for c, i in enumerate(product(zip(l1,l2), repeat = 2), 1): 
    print(i, '\n' if c % 4 == 0 else '') 

輸出:

((1, 'a'), (1, 'a')) 
((1, 'a'), (2, 'b')) 
((1, 'a'), (3, 'c')) 
((1, 'a'), (4, 'd')) 

((2, 'b'), (1, 'a')) 
((2, 'b'), (2, 'b')) 
((2, 'b'), (3, 'c')) 
((2, 'b'), (4, 'd')) 

((3, 'c'), (1, 'a')) 
((3, 'c'), (2, 'b')) 
((3, 'c'), (3, 'c')) 
((3, 'c'), (4, 'd')) 

((4, 'd'), (1, 'a')) 
((4, 'd'), (2, 'b')) 
((4, 'd'), (3, 'c')) 
((4, 'd'), (4, 'd'))