【问题标题】:Combine multiple dictionaries with the same schema将多个字典与相同的模式组合
【发布时间】:2020-05-07 14:11:27
【问题描述】:

假设我有一个未知长度和未知但一致模式的字典列表,如下所示。请注意,这些值始终是相同长度的列表。

res = [{'x': [2, 1], 'v': [49280, 536704]},
 {'x': [1, 4], 'v': [12336, 340000]},
 {'x': [5, 6], 'v': [524360, 151624]},
 {'x': [7, 1], 'v': [94280, 81968]},
 {'x': [1, 1], 'v': [241856, 335904]},
 {'x': [7, 7], 'v': [463016, 598040]},
 {'x': [2, 9], 'v': [606256, 422016]},
 {'x': [1, 1], 'v': [151680, 1237120]}]

有没有一种有效的方法可以将它们合并到一个字典中?这个例子的最终结果是:

 {'x': [2, 1, 1, 4, 5, 6, 7, 1, 1, 1, 7, 7, 2, 9, 1, 1], 
  'v': [49280, 536704, 12336, 340000, 524360, 151624, 94280, 81968, 241856, 335904, 463016, 598040, 606256, 422016, 151680, 1237120]}

工作解决方案

这行得通,但我想知道这个操作是否只有一条线?

output_dct = {}
for dct in res:
    for k, v in dct.items():
        output_dct[k] = v if k not in output_dct.keys() else output_dct[k] + v

【问题讨论】:

    标签: python dictionary


    【解决方案1】:

    使用dict.setdefault 的更好方法

    例如:

    output_dct = {}
    for dct in res:
        for k, v in dct.items():
            output_dct.setdefault(k, []).extend(v)
    

    或使用collections.defaultdict

    from collections import defaultdict
    output_dct = defaultdict(list)
    for dct in res:
        for k, v in dct.items():
            output_dct[k].extend(v)
    
    print(output_dct)
    

    输出:

    {'x': [2, 1, 1, 4, 5, 6, 7, 1, 1, 1, 7, 7, 2, 9, 1, 1], 
    'v': [49280, 536704, 12336, 340000, 524360, 151624, 94280, 81968, 241856, 335904, 463016, 598040, 606256, 422016, 151680, 1237120]}
    

    【讨论】:

      【解决方案2】:

      你是说单线?到理解手机!

      >>> {k: sum((d[k] for d in res), []) for d in res for k in d}
      {'x': [2, 1, 1, 4, 5, 6, 7, 1, 1, 1, 7, 7, 2, 9, 1, 1], 'v': [49280, 536704, 12336, 340000, 524360, 151624, 94280, 81968, 241856, 335904, 463016, 598040, 606256, 422016, 151680, 1237120]}
      

      (编辑:实际上,我可能会像 Rakesh 那样使用 defaultdict 来执行此操作,因为嵌套的推导在页面上很紧凑,但对于代码的其他读者来说并不一定很明显。)

      【讨论】:

        猜你喜欢
        • 2019-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-18
        • 2015-11-15
        • 2015-07-26
        • 2012-05-20
        相关资源
        最近更新 更多