Цикл для каждого элемента в списке

У меня есть словарь:

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

Кажется, что был бы простой способ сделать это так, чтобы он расширялся, если у меня есть три предмета. Вроде как динамическое количество циклов. Такое ощущение, что мне не хватает очевидного способа сделать это...

4 ответа

Решение

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

Вы также можете грубо заставить его использовать две петли

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

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

Все, что делает этот код, проходит через весь элемент в mydict['item1']затем через каждый элемент в mydict['item2'], а затем добавляет пару каждого в новый список.

Это даст вам такой результат:

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

Вы можете использовать список понимания:

[(i, j) for i in mydict['item1'] for j in mydict['item2']]

Вы могли бы сделать два для петель. - первый будет отслеживать позицию индекса первого списка элементов. -Второй цикл будет проходить через каждый элемент во втором. - После прохождения всех элементов первый цикл for будет увеличиваться до следующего элемента в своем списке, а второй цикл снова будет проходить через второй список и т. Д.

Другие вопросы по тегам