【问题标题】:Get the average of all values if a certain key is the same如果某个键相同,则获取所有值的平均值
【发布时间】:2017-05-24 12:13:20
【问题描述】:

所以我有这个字典列表:

l = [{'COUNTRY': 'UK', 'CREDITS': '54'}, {'COUNTRY': 'PT', 'CREDITS': '100'}, {'COUNTRY': 'FR', 'CREDITS': '20'}, {'COUNTRY': 'UK', 'CREDITS': '30'}, {'COUNTRY': 'UK', 'CREDITS': '15'}, {'COUNTRY': 'PT', 'CREDITS': '35'}, {'COUNTRY': 'FR', 'CREDITS': '30'}]

我需要获得每个国家/地区学分的平均值。输出应该是这样的:

l2 = {'UK': '102', 'PT': '67.5', 'FR': '25'}

有什么简单易行的方法来实现吗?

【问题讨论】:

    标签: python python-2.7 list dictionary


    【解决方案1】:

    我会首先创建一个defaultdict 来收集“COUNTRY”键下整数列表中的值。

    然后我将创建一个 dict 理解,执行均值:

    l = [{'COUNTRY': 'UK', 'CREDITS': '54'}, {'COUNTRY': 'PT', 'CREDITS': '100'}, {'COUNTRY': 'FR', 'CREDITS': '20'}, {'COUNTRY': 'UK', 'CREDITS': '30'}, {'COUNTRY': 'UK', 'CREDITS': '15'},
     {'COUNTRY': 'PT', 'CREDITS': '35'}, {'COUNTRY': 'FR', 'CREDITS': '30'}]
    
    import collections
    
    d = collections.defaultdict(list)
    for s in l:
        d[s["COUNTRY"]].append(int(s["CREDITS"]))
    
    result = {k:sum(v)/len(v) for k,v in d.items()}
    
    print(result)
    

    结果:

    {'UK': 33.0, 'PT': 67.5, 'FR': 25.0}
    

    请注意 1)您的预期结果是错误的,并且 2)我转换为浮点数,但您可以通过这样做将其保留为整数作为字符串

    result = {k:str(sum(v)//len(v)) for k,v in d.items()}
    

    给出:

    {'PT': '67', 'FR': '25', 'UK': '33'}
    

    【讨论】:

      【解决方案2】:

      使用itertools.groupby()itertools.tee() 函数的替代解决方案:

      import itertools
      
      l = [{'COUNTRY': 'UK', 'CREDITS': '54'}, {'COUNTRY': 'PT', 'CREDITS': '100'}, {'COUNTRY': 'FR', 'CREDITS': '20'}, {'COUNTRY': 'UK', 'CREDITS': '30'}, {'COUNTRY': 'UK', 'CREDITS': '15'}, {'COUNTRY': 'PT', 'CREDITS': '35'}, {'COUNTRY': 'FR', 'CREDITS': '30'}]
      avgs = {}
      
      for k,g in itertools.groupby(sorted(l, key=lambda x: x['COUNTRY']), key=lambda x: x['COUNTRY']):
          d1,d2 = itertools.tee(g)  # copy `grouper` iterator to deal with "fresh" pointer
          avgs[k] = sum(int(d['CREDITS']) for d in d1)/len(list(d2))
      
      print(avgs)
      

      输出:

      {'UK': 33.0, 'FR': 25.0, 'PT': 67.5}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-28
        • 1970-01-01
        • 2011-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多