簡體   English   中英

列表字典中的列表字典

[英]Dictionary of lists from list of lists

我有一個數據列表清單:

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

這很簡單:

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]}

采用:

{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]}

您的問題在列表中包含了所有內容,因此,如果您想要字典列表:

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]}]

如果您實際上想要字典,請對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))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM