【问题标题】:Merge an arbitrary number of dictionaries of lists合并任意数量的列表字典
【发布时间】:2015-07-28 10:34:13
【问题描述】:

如何在 Python 中合并值是列表的字典,以便将所有键移动到一个字典中,并将每个列表的所有元素移动到每个键的单个列表中?

例如,使用这些词典:

x = {'a': [2], 'b': [2]}
y = {'b': [11], 'c': [11]}

...合并的结果应该是这样的:

{'a': [2], 'b': [2, 11], 'c': [11]}

这怎么能用任意数量的字典来完成,而不仅仅是两个?

【问题讨论】:

    标签: python list dictionary merge


    【解决方案1】:

    您可以使用以下方法,使用setsdict comprehension

    x = {'a': [2], 'b': [2]} 
    y = {'b': [11], 'c': [11]}
    
    all_keys = set(x) | set(y)
    
    print {k:x.get(k, [])+y.get(k, []) for k in all_keys}
    

    结果:

    {'a': [2], 'c': [11], 'b': [2, 11]}
    

    【讨论】:

    • all_keys = set(x) | set(y) 可以在 2 和 3 中使用。
    • 谢谢@DSM 另外我什至不喜欢.keys() 方法。
    • @DSM 错过了:)
    • 为什么不干脆去掉 all_keys?该表达式足够简短/容易,只需直接放入理解即可。
    • @StefanPochmann:嗯,不值得担心。另外,如果我们想做通用版本(使用任意数量的字典),无论如何使用单独的变量会更清楚。
    【解决方案2】:
    for k, v in y.items():
        x.setdefault(k, []).extend(v)
    

    【讨论】:

      【解决方案3】:

      x = {'a': [2], 'b': [2]}
      y = {'b': [11], 'c': [11]}
      result = {}
      for key,value in x.iteritems():
          result[key] = value
      for key,value in y.iteritems():
          if key in result:
              for l in value:
                  result[key].append(l)
          else:
              result[key] = value
      print result

      【讨论】:

        【解决方案4】:

        要将所有列表收集在一起,请形成一个 result 字典,将您的键映射到列表。最简单的方法是使用dict.setdefault(),然后调用list.extend 来增加列表:

        r = {}
        for d in [x, y]:
            for k, v in d.items():
                r.setdefault(k, []).extend(v)
        

        更优雅的方式是使用collections.defaultdict(),其中自动默认是一个新的空列表:

        from collections import defaultdict
        
        r = defaultdict(list)
        for d in [x, y]:
            for k, v in d.items():
                r[k].extend(v)
        

        【讨论】:

          【解决方案5】:

          这是一个适用于任意数量字典的解决方案:

          def collect(*dicts):
              result = {}
              for key in set.union(*(set(d) for d in dicts)):
                  result[key] = sum((d.get(key, []) for d in dicts), [])
              return result
          

          它本质上是对 Tanveer 答案的概括,利用了 set.union() 可以接受任意数量的字典作为参数这一事实。

          这里是一个正在使用的函数的例子:

          >>> x = {'a': [2], 'b': [2]}
          >>> y = {'b': [11], 'c': [11]}
          >>> collect(x, y)
          {'a': [2], 'c': [11], 'b': [2, 11]}
          

          ...并带有多个字典:

          >>> z = {'c': [12, 13], 'd': [5]}
          >>> collect(x, y, z)
          {'a': [2], 'c': [11, 12, 13], 'b': [2, 11], 'd': [5]}
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-07-29
            • 1970-01-01
            • 2023-03-23
            • 2021-10-06
            • 2012-08-11
            相关资源
            最近更新 更多