代码之家  ›  专栏  ›  技术社区  ›  Jason Strimpel

三个列表压缩成一个目录列表

  •  20
  • Jason Strimpel  · 技术社区  · 6 年前

    考虑以下因素:

    >>> # 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 回复  |  直到 6 年前
        1
  •  40
  •   DYZ    6 年前
    {k : {key_1 : v1, key_2 : v2} for k,v1,v2 in zip(idx, l_1, l_2)}
    
        2
  •  15
  •   Moinuddin Quadri    6 年前

    解决方案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))}
    

    解决方案2 :您也可以使用 拉链 带嵌套 列表理解 作为:

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

    解决方案3 :使用 词典理解 在上面 拉链 在中共享 DYZ's answer :

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

    以上所有解决方案都将返回 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}
     }
    
        3
  •  2
  •   Eric Duminil    6 年前

    您正在使用dict、列表、索引、键,并希望转换数据。与合作可能有意义 pandas ( DataFrame ,则, .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}
    }
    
        4
  •  1
  •   Dan D.    6 年前

    还可以使用itertools中的dict、zip、map和repeat完成:

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