列表列表中的列表字典

时间:2015-01-23 16:37:15

标签: python list dictionary

我有一份数据清单:

[[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方式。

3 个答案:

答案 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))