2016-10-01 4 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) 

Я знаю, что правильное решение было бы объединить для петель. Но это не подходит для меня, поскольку я хочу увеличить repeat -counter.

ответ

3

Предоставляя zip из списков product:

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

Обертывание в list не требуется, для цикла заботится о вызове next итератора для вас.

Если вы хотите новую линию для каждых 4 комбинаций, используйте enumerate (начиная с 1) и добавьте \n когда c % 4 является 0:

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')) 

 Смежные вопросы

  • Нет связанных вопросов^_^