三个列表压缩成dicts列表

Jas*_*pel 20 python mapping zip dictionary

考虑以下:

>>> # 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'
Run Code Online (Sandbox Code Playgroud)

我怎么把这个烂摊子看起来像这样?

{
    '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},
    ...
}
Run Code Online (Sandbox Code Playgroud)

我最接近的是这样的:

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

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

>>> dict(zip(('mkt_o', 'mkt_c'), (1,2)))
{'mkt_o': 1, 'mkt_c': 2}
Run Code Online (Sandbox Code Playgroud)

这似乎有可能是有希望的,但再次,无法满足要求.

DYZ*_*DYZ 38

{k : {key_1 : v1, key_2 : v2} for k,v1,v2 in zip(idx, l_1, l_2)}
Run Code Online (Sandbox Code Playgroud)


Moi*_*dri 15

解决方案1:您可以使用zip两次(实际上是三次)字典解析实现这一目标为:

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))}
Run Code Online (Sandbox Code Playgroud)

解决方案2:您还可以将zip嵌套列表理解用作:

new_dict = dict(zip(idx, [{key_1: i, key_2: j} for i, j in zip(l_1, l_2)]))
Run Code Online (Sandbox Code Playgroud)

解决方案3:使用字典理解之上zip的共享DYZ的回答:

new_dict = {k : {key_1 : v1, key_2 : v2} for k,v1,v2 in zip(idx, l_1, l_2)}
Run Code Online (Sandbox Code Playgroud)

以上所有解决方案将返回new_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}
 }
Run Code Online (Sandbox Code Playgroud)