三个列表压缩成dicts列表

时间:2018-03-27 07:00:14

标签: python dictionary zip mapping

请考虑以下事项:

>>> # list of length n
>>> idx = ['a', 'b', 'c', 'd']

>>> # list of length n
>>> l_1 = [1, 2, 3, 4]

>>> # list of length n
>>> l_2 = [5, 6, 7, 8]

>>> # first key
>>> key_1 = 'mkt_o'

>>> # second key
>>> key_2 = 'mkt_c'

如何将这个烂摊子看起来像这样?

{
    'a': {'mkt_o': 1, 'mkt_c': 5},
    'b': {'mkt_o': 2, 'mkt_c': 6},
    'c': {'mkt_o': 3, 'mkt_c': 6},
    'd': {'mkt_o': 4, 'mkt_c': 7},
    ...
}

我最接近的是这样的:

>>> dict(zip(idx, zip(l_1, l_2)))
{'a': (1, 5), 'b': (2, 6), 'c': (3, 7), 'd': (4, 8)}

当然,将元组作为值而不是字典,

>>> dict(zip(('mkt_o', 'mkt_c'), (1,2)))
{'mkt_o': 1, 'mkt_c': 2}

这看起来似乎很有希望,但又不能满足要求。

4 个答案:

答案 0 :(得分:38)

{k : {key_1 : v1, key_2 : v2} for k,v1,v2 in zip(idx, l_1, l_2)}

答案 1 :(得分:15)

解决方案1 ​​:您可以使用字典理解两次<{1}} (实际上是三次)来实现此目的:

zip

解决方案2 :您也可以将idx = ['a', 'b', 'c', 'd'] l_1 = [1, 2, 3, 4] l_2 = [5, 6, 7, 8] keys = ['mkt_o', 'mkt_c'] # yours keys in another list new_dict = {k: dict(zip(keys, v)) for k, v in zip(idx, zip(l_1, l_2))} 与嵌套列表理解结合使用:

zip

解决方案3 :在DYZ's answer中共享的new_dict = dict(zip(idx, [{key_1: i, key_2: j} for i, j in zip(l_1, l_2)])) 上使用词典理解

zip

以上所有解决方案都会将new_dict = {k : {key_1 : v1, key_2 : v2} for k,v1,v2 in zip(idx, l_1, l_2)} 返回为:

new_dict

答案 2 :(得分:2)

您正在处理dicts,列表,索引,键并希望转置数据。使用pandasDataFrame.T.to_dict)可能有意义:

>>> import pandas as pd
>>> idx = ['a', 'b', 'c', 'd']
>>> l_1 = [1, 2, 3, 4]
>>> l_2 = [5, 6, 7, 8]
>>> key_1 = 'mkt_o'
>>> key_2 = 'mkt_c'
>>> pd.DataFrame([l_1, l_2], index=[key_1, key_2], columns = idx)
       a  b  c  d
mkt_o  1  2  3  4
mkt_c  5  6  7  8
>>> pd.DataFrame([l_1, l_2], index=[key_1, key_2], columns = idx).T
   mkt_o  mkt_c
a      1      5
b      2      6
c      3      7
d      4      8
>>> pd.DataFrame([l_1, l_2], index=[key_1, key_2], columns = idx).to_dict()
{'a': {'mkt_o': 1, 'mkt_c': 5},
 'b': {'mkt_o': 2, 'mkt_c': 6},
 'c': {'mkt_o': 3, 'mkt_c': 7},
 'd': {'mkt_o': 4, 'mkt_c': 8}
}

答案 3 :(得分:1)

它也可以用dict,zip,map和itertools重复来完成:

>>> from itertools import repeat
>>> dict(zip(idx, map(dict, zip(zip(repeat(key_1), l_1), zip(repeat(key_2), l_2)))))
{'a': {'mkt_c': 5, 'mkt_o': 1}, 'c': {'mkt_c': 7, 'mkt_o': 3}, 'b': {'mkt_c': 6, 'mkt_o': 2}, 'd': {'mkt_c': 8, 'mkt_o': 4}}