【问题标题】:How to find common keys in a list of dicts and sort them by value?如何在字典列表中找到公共键并按值排序?
【发布时间】:2012-12-08 18:30:06
【问题描述】:

我想创建一个包含公共键和它们的值总和的 finalDic

myDic = [{2:1, 3:1, 5:2}, {3:4, 6:4, 2:3}, {2:5, 3:6}, ...]

先找到常用键

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

然后按它们的值求和并排序

finalDic= {3:11, 2,9}

我已经尝试过了,甚至没有关闭我想要的

import collections

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

def commonKey(x):
    i=0
    allKeys = []
    while i<len(x):
        for key in x[0].keys():
            allKeys.append(key)
        i=i+1
    commonKeys = collections.Counter(allKeys)
    commonKeys = [i for i in commonKeys if commonKeys[i]>len(x)-1]
    return commonKeys

print commonKey(myDic)

谢谢

【问题讨论】:

    标签: python list sorting dictionary


    【解决方案1】:

    我会这样做:

    my_dict = [{2:1, 3:1, 5:2}, {3:4, 6:4, 2:3}, {2:5, 3:6}]
    
    # Finds the common keys
    common_keys = set.intersection(*map(set, my_dict))
    
    # Makes a new dict with only those keys and sums the values into another dict
    summed_dict = {key: sum(d[key] for d in my_dict) for key in common_keys}
    

    或者作为一个疯狂的单线:

    {k: sum(d[k] for d in my_dict) for k in reduce(set.intersection, map(set, my_dict))}
    

    【讨论】:

    • 我会选择 summed_dict = {k:sum(d[k] for d in new_dicts) for k in common_keys} 而不是 defaultdict 方法
    • @inspectorG4dget:谢谢。我不确定我要去哪里。
    • @Blender 不错的功能解决方案
    • 但是你可以在没有reduce 的情况下使用set.intersection 函数:set.intersection(*map(set, my_dict)) 也会更快
    • @bekman:字典没有顺序。如果你想要一个有序的字典,请使用来自collections 的这个帮助类:docs.python.org/2/library/…
    【解决方案2】:

    只有一些指针:

    • 从每个目录中获取密钥,然后将它们转换为 set() 并计算 intersection() 或所有键集。这将为您提供公共密钥。
    • 现在迭代原始数据并总结每个字典的匹配值 直截了当

    实现留给 OP 作为练习。

    【讨论】:

      【解决方案3】:
      l = [{2:1, 3:1, 5:2}, {3:4, 6:4, 2:3}, {2:5, 3:6}]
      
      new_dict = {}
      
      def unique_key_value(a,b):
          return set(a).intersection(set(b))
      
      def dict_sum(k, v):
          if k not in new_dict.keys():
              new_dict[k] = v
          else:
              new_dict[k] = new_dict[k] + v
      
      for i in reduce(unique_key_value, l):
          for k in l:
              if i in k.keys():
                  dict_sum(i, k[i])
      
      print new_dict
      

      希望这会有所帮助。 :)

      【讨论】:

        【解决方案4】:

        python 3.2

        from collections import defaultdict
        c=defaultdict(list)
        for i in myDic:
             for m,n in i.items():
                    c[m].append(n)
        new_dic={i:sum(v) for i,v in c.items()if len(v)==len(myDic)}
        print(new_dic)
        

        【讨论】:

          猜你喜欢
          • 2021-02-23
          • 2011-07-16
          • 2020-08-05
          • 1970-01-01
          • 2016-08-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-06-25
          相关资源
          最近更新 更多