2012-07-18 1 views
3

У меня есть этот Dict:Как превратить словарь со списками как значения в список словарей с одиночными значениями?

{ 
    'x': [0,1,2], 
    'y': ['a','b','c'] 
} 

Словарь, где все значения представляют собой списки, одинаковой длины.

Я хочу, чтобы произвести это:

[ 
    { 'x': 0, 'y': 'a' }, 
    { 'x': 1, 'y': 'b' }, 
    { 'x': 2, 'y': 'c' } 
] 

Есть ли эффективный способ сделать это? Надеюсь, используя что-то в itertools?

ответ

6
[dict(zip(d, vals)) for vals in zip(*d.values())] 

Например:

>>> d = {'y': ['a', 'b', 'c'], 'x': [0, 1, 2]} 
>>> [dict(zip(d, vals)) for vals in zip(*d.values())] 
[{'y': 'a', 'x': 0}, {'y': 'b', 'x': 1}, {'y': 'c', 'x': 2}] 
+0

красивая. Благодарю. – Cera

+1

Не забудьте принять, если он ответил на ваш вопрос :) –

1
[dict(stuff) for stuff in zip(*[[(k, v) for v in vs] for k, vs in myDict.iteritems()])] 
0
[{'x': v, 'y': d['y'][i]} for i, v in enumerate(d['x'])] 
+1

Это работает только в самом конкретном случае «х» и «у», являющихся ключами, когда это было, вероятно, только примером (может быть более двух ключей , и ключи могут быть неизвестны заранее). –

+0

да, я знаю, вот почему я проголосовал за ваш ответ ... – gecco

+0

О, благодарю вас :-) –

0

d = { 
    'x': [0,1,2], 
    'y': ['a','b','c'] 
} 
values = zip(*d.values()) 
print [dict(zip(d.keys(), v)) for v in values] 
Смежные вопросы