【问题标题】:update one dictionary with another by adding values rather then replacing it通过添加值而不是替换它来用另一个字典更新一个字典
【发布时间】:2011-08-26 14:56:04
【问题描述】:

我有很多这样的字典:

dict1 = {1:[1,2,3],2:[2,3,4]}
dict2 = {2:[3,4,5],3:[4,5,6]}

我需要得到

dict = {1:[1,2,3],2:[2,3,4,3,4,5],3:[4,5,6]}
#                       ^
#                       | order is unimportant

最好的方法是什么?

【问题讨论】:

    标签: python dictionary


    【解决方案1】:

    遍历dict2的键;如果 dict1 中存在相同的键,则连接列表并在 dict1 中设置;否则只需在dict1中设置

    【讨论】:

      【解决方案2】:

      简单迭代一个扩展列表...

      for key, value in dict2.iteritems():
          dict1.setdefault(key, []).extend(value)
      

      【讨论】:

      • 很好。可以写成一行[ dict1.setdefault(k, []).extend(v) for k,v in dict2.iteritems()]
      • 纯粹为了副作用而使用列表推导是丑陋的。
      【解决方案3】:
      dict1 = {1:[1,2,3],2:[2,3,4]}
      dict2 = {2:[3,4,5],3:[4,5,6]}
      
      dicts = [dict1, dict2]
      new_dict = {}
      
      for d in dicts:
        for k, v in d.iteritems():
          if new_dict.has_key(k):
            new_dict[k] = new_dict[k] + v
          else:
            new_dict[k] = v
      

      【讨论】:

        【解决方案4】:
        a = {'a' : [1,2], 'b' : [3,4]}
        b = {'a' : [3,4], 'b' : [1,2]}
        
        for key in a.keys():
            for elem in a[key]:
                b[key].append(elem)
        

        【讨论】:

        • 提问者示例中的 KeyError,因为他们的“b”列表不包含 1 键。
        【解决方案5】:

        哦,也许有一些聪明的方法可以用 reduce 来做到这一点,但为什么不像普通人一样编写代码。

        dict = {}
        for each_dict in (dict1, dict2, ...): # ... is not real code
            for key, value in each_dict:
                if not dict.has_key(key):
                    dict[key] = []
                dict[key] += value # list append operator
        

        【讨论】:

          【解决方案6】:

          我有很多这样的字典:

          这种方式可以让您一次将多个字典“粘合在一起”:

          dict(
            (k, sum((d.get(k, []) for d in dicts), []))
            for k in set(sum((d.keys() for d in dicts), []))
          )
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-08-17
            • 2023-02-10
            • 2021-03-11
            • 1970-01-01
            • 2013-02-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多