我有一份数据清单:
[[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], ...]
我可以使用循环来做到这一点,但我正在寻找一种pythonic方式。
答案 0 :(得分: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]}
答案 1 :(得分: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]}
答案 2 :(得分: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,请使用带有zip的字典理解:
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]}
您的示例还有一个短于列表长度的键列表,因此压缩实际上意味着您从子列表中丢失值,因此您可能希望解决这个问题。
如果您使用的是python2,则可以使用itertools.izip
:
from itertools import izip
print({a:list(b) for a,b in izip(l2,zip(*l1))