2015-05-14 3 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)) 

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

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

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

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

+0

Это именно то, что я сделал в [моем ответе] (http://stackoverflow.com/a/30228048/4087357) – michaelpri

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