【问题标题】:Python: Adding values from multiple dictionaries and merging unique keysPython:从多个字典中添加值并合并唯一键
【发布时间】:2018-07-26 15:54:45
【问题描述】:

我有 2 个字典,它们共享大约 80% 的相同键,值是 2 个元素列表。我需要从三个包含所有键的新字典中创建一个新字典,包括每个字典唯一的键,并且我需要汇总相同键的值。

    dict1 = {'Mike': [10,20], 'John': [12,34], 'Steve': [60,10]}
    dict2 = {'Mike': [15,10], 'John': [18,36]}

新字典应该是这样的:

    dict3 = {'Mike': [25,30], 'John': [30,70], 'Steve': [60,10]}

知道我应该如何解决这个问题吗?

【问题讨论】:

标签: python python-3.x dictionary merge key-value


【解决方案1】:

根据both_key 中的键所属的位置,从两个字典中获取键,遍历并填充 dict3

both_keys = set(list(dict1.keys()) + list(dict2.keys()))
dict3 = {}
for k in both_keys:
    if k in dict1 and k in dict2:
        dict3[k] = [sum(x) for x in zip(dict1[k], dict2[k])]
    elif k in dict1:
        dict3[k] = dict1[k]
    else:
        dict3[k] = dict2[k]

【讨论】:

    【解决方案2】:

    我的解决方案使用 numpy :

    import numpy as np
    sum_dict = {}
    for key in set(dict1.keys() + dict2.keys()):
        sum_dict[key] = np.add(dict1.get(key, np.zeros(2)), dict2.get(key, np.zeros(2)))
    
    1. 连接所有 2 个键
    2. 循环并使用 numpy add 对值求和,默认值为 numpy 零数组

    如果需要,可以转换回列表的字典

    dict([(k,list(v)) for (k,v) in sum_dict.items()])
    Out[99]:
    {'John': [30, 70], 'Mike': [25, 30], 'Steve': [60.0, 10.0]}
    

    【讨论】:

      【解决方案3】:

      有很多方法可以做到这一点,但这里有一种方法可以最大限度地减少查找,如果实际的字典很大,这可能会有所帮助:

      keys_1 = set(dict1.keys())
      keys_2 = set(dict2.keys())
      all_keys = keys_1 | keys_2
      for key in all_keys:
          a,b = 0,0
          if key in keys_1:
              a += dict1[key][0]
              b += dict1[key][1]
          if key in keys_2:
              a += dict2[key][0]
              b += dict2[key][1]
          dict3[key] = [a,b]
      

      【讨论】:

        【解决方案4】:

        这是我对任意数量的字典和任意数量的 zip-sum 值的某种功能性解决方案的尝试。

        定义您希望如何合并条目。在这种情况下,通过对各个组件求和,实现结果:

        merge = lambda vs: list(map(sum, zip(*vs)))
        

        然后定义如何合并两个dict:

        def merge_dicts(ds):
            keys = set.union(*map(set, ds))
            return {k: merge(map(lambda d: d.get(k, repeat(0)), ds))
                    for k in keys}
        

        在这里,我只是检查所有键的并集,合并每个字典的条目,repeat(0) 作为默认值,因此merge() 只会对缺失值求和。

        之后你可以像这样合并你的字典:

        merged = merge_dicts([dict1, dict2])
        

        【讨论】:

          【解决方案5】:

          试试这个:

          dict1 = {'Mike': [10,20], 'John': [12,34], 'Steve': [60,10]}
          dict2 = {'Mike': [15,10], 'John': [18,36]}
          
          new_dict = {}
          
          for x, y in dict1.items():
          if x in dict2.keys():
              new_dict[x] = [a + b for a, b in zip(dict2[x], dict1[x])]
          else:
              new_dict[x] = dict1[x]
          print(new_dict)
          
          #Output : {'Mike': [25, 30], 'John': [30, 70], 'Steve': [60, 10]}
          

          【讨论】:

            猜你喜欢
            • 2021-04-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-03-18
            • 1970-01-01
            • 1970-01-01
            • 2021-10-06
            相关资源
            最近更新 更多