2015-01-23 4 views
0

У меня есть список списков данных:словарь списков из списка списков

[[1422029700000, 230.84, 230.42, 230.31, 230.32, 378], [1422029800000, 231.84, 231.42, 231.31, 231.32, 379], ...] 

и список ключей:

['a', 'b', 'c', 'd', 'e'] 

Я хочу, чтобы объединить их в словарь списков так это выглядит так:

['a': [1422029700000, 1422029800000], 'b': [230.84, 231.84], ...] 

Я могу сделать это с помощью петель, но я ищу питоновский путь.

ответ

6

Это довольно просто:

In [1]: keys = ['a','b','c'] 

In [2]: values = [[1,2,3],[4,5,6],[7,8,9]] 

In [7]: dict(zip(keys, zip(*values))) 
Out[7]: {'a': (1, 4, 7), 'b': (2, 5, 8), 'c': (3, 6, 9)} 

Если вам нужны списки в качестве значений:

In [8]: dict(zip(keys, [list(t) for t in zip(*values)])) 
Out[8]: {'a': [1, 4, 7], 'b': [2, 5, 8], 'c': [3, 6, 9]} 

или:

In [9]: dict(zip(keys, map(list, zip(*values)))) 
Out[9]: {'a': [1, 4, 7], 'b': [2, 5, 8], 'c': [3, 6, 9]} 
+0

Простой и элегантный. –

+0

Спасибо, исправил ответ. – piokuc

+0

Обновленный ответ работает отлично, спасибо –

2

Использование:

{k: [d[i] for d in data] for i, k in enumerate(keys)} 

Пример:

>>> data=[[1422029700000, 230.84, 230.42, 230.31, 230.32, 378], [1422029800000, 231.84, 231.42, 231.31, 231.32, 379]] 
>>> keys = ["a", "b", "c"] 
>>> {k: [d[i] for d in data] for i, k in enumerate(keys)} 
{'c': [230.42, 231.42], 'a': [1422029700000, 1422029800000], 'b': [230.84, 231.84]} 
0

Ваш вопрос имеет все, что в списке, так что если вы хотите получить список dicts:

l1= [[1422029700000, 230.84, 230.42, 230.31, 230.32, 378], [1422029800000, 231.84, 231.42, 231.31, 231.32, 379]] 
l2 = ['a', 'b', 'c', 'd', 'e',"f"] # added f to match length of sublists 
print([{a:list(b)} for a,b in zip(l2,zip(*l1))]) 
[{'a': [1422029700000, 1422029800000]}, {'b': [230.84, 231.84]}, {'c': [230.42, 231.42]}, {'d': [230.31, 231.31]}, {'e': [230.32, 231.32]}, {'f': [378, 379]}] 

Если вы действительно хотите в Используйте Dict в Словаре понимание с молнией:

print({a:list(b) for a,b in zip(l2,zip(*l1))}) 
{'f': [378, 379], 'e': [230.32, 231.32], 'a': [1422029700000, 1422029800000], 'b': [230.84, 231.84], 'c': [230.42, 231.42], 'd': [230.31, 231.31]} 

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

Если вы используете python2 вы можете использовать itertools.izip:

from itertools import izip 
print({a:list(b) for a,b in izip(l2,zip(*l1)) 
+1

Несколько диктов? Это действительно не соответствует желаемому результату OP – GLHF

+0

@howaboutNO, OP использует синтаксис списка, если вы видели '['a': [1422029700000, 1422029800000]]' синтаксис с dict раньше? У ОП есть все в списке –

+0

Вы правы, у меня было все в списке. Моя ошибка в том, что я не понял, что у меня неправильный синтаксис для дикта. Спасибо за ваш вклад. –

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