【问题标题】:Convert list of lists to dictionary of dictionaries将列表列表转换为字典字典
【发布时间】:2017-04-23 02:26:18
【问题描述】:

我有一个包含键/值的 Python 列表

[ [001, 'A', '100'], [001, 'B', '94'], [002, 'A', '87'], [002, 'B', '85'] ]

但前 2 列是唯一键。我想将列表转换为字典,其中每个键的多个值将聚合到字典字典中,以便于查找值

{'001': {'A':'100','B':'94'}, '002': {'A':'87','B':'85'} }

优雅的 Python 方法是什么?谢谢。

【问题讨论】:

    标签: python list dictionary type-conversion


    【解决方案1】:

    可能最好的方法是使用字典作为工厂的默认字典:

    from collections import defaultdict
    
    dictofdicts = defaultdict(dict)
    
    start = [ ['001', 'A', '100'], ['001', 'B', '94'], ['002', 'A', '87'], ['002', 'B', '85'] ]
    
    for outerkey, innerkey, value in start:
        dictofdicts[outerkey][innerkey] = value
    

    这将为您提供您想要的解决方案:

    >>> dictofdicts
    defaultdict(dict,
                {'001': {'A': '100', 'B': '94'}, '002': {'A': '87', 'B': '85'}})
    

    defaultdict 可以像普通字典一样使用,但你也可以在之后将其转换为普通字典:

    >>> dict(dictofdicts)
    {'001': {'A': '100', 'B': '94'}, '002': {'A': '87', 'B': '85'}}
    

    【讨论】:

      【解决方案2】:

      你可以使用collections.defaultdict():

      In [54]: lst = [ ['001', 'A', '100'], ['001', 'B', '94'], ['002', 'A', '87'], ['002', 'B', '85'] ]
      
      In [55]: from collections import defaultdict
      
      In [56]: d = defaultdict(dict)
      
      In [57]: for i, j, k in lst:
         ....:     d[i].update({j:k})
         ....:     
      
      In [58]: d
      Out[58]: defaultdict(<class 'dict'>, {'001': {'A': '100', 'B': '94'}, '002': {'A': '87', 'B': '85'}})
      

      【讨论】:

        【解决方案3】:

        在字典理解中:

        >>> l = [ ['001', 'A', '100'], ['001', 'B', '94'], ['002', 'A', '87'], ['002', 'B', '85'] ]
        >>> {l[i][0]:{k:v for (k, v) in zip(l[i][1:], l[i+1][1:])} for i in range(0, len(l), 2)}
        {'002': {'A': 'B', '87': '85'}, '001': {'100': '94', 'A': 'B'}}
        

        【讨论】: