2013-09-27 2 views
1

У меня есть эта структура:Итерация dicts из в Словаре сращиваемых длины списков

d = { 
    "a": [1, 2, 3], 
    "b": [4, 5, 6], 
    "c": [7, 8, 9], 
} 

Длины списков гарантированно соответствовать. Я хочу, чтобы итератор я могу для-перебрать, который будет обслуживать до Dict для каждого столбца в списках, вроде как молния превратилась обратно в Словаре с оригинальными названиями клавиш каждый раз, как это:

>>> for i in iDictOfListsToDicts(d): 
...  print i 
{"a": 1, "b": 4, "c": 7} 
{"a": 2, "b": 5, "c": 8} 
{"a": 3, "b": 6, "c": 9} 

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

Я играл с вещами, которые начинаются так:

map(iter, d.values()) 

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

ответ

1

Используйте zip или использовать map с None:

>>> zip([1,2,3], [4,5,6], [7,8,9]) 
[(1, 4, 7), (2, 5, 8), (3, 6, 9)] 
>>> map(None, [1,2,3], [4,5,6], [7,8,9]) 
[(1, 4, 7), (2, 5, 8), (3, 6, 9)] 

Try следующее:

def iDictOfListsToDicts(d): 
    keys = list(d) 
    for vs in zip(*d.values()): 
     yield dict(zip(keys, vs)) 

пример:

>>> d = { 
...  "a": [1, 2, 3], 
...  "b": [4, 5, 6], 
...  "c": [7, 8, 9], 
... } 
>>> for i in iDictOfListsToDicts(d): 
...  print i 
... 
{'a': 1, 'c': 7, 'b': 4} 
{'a': 2, 'c': 8, 'b': 5} 
{'a': 3, 'c': 9, 'b': 6} 
+0

Я использовал молнию, но возиться с частями вокруг него:) В любом случае, все. Я знал, что есть простой, маленький ответ. Благодарю. –

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