Цикл для каждого элемента в списке
У меня есть словарь:
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 будет увеличиваться до следующего элемента в своем списке, а второй цикл снова будет проходить через второй список и т. Д.