Python 如果某个键相同,则获取所有值的平均值

Python 如果某个键相同,则获取所有值的平均值,python,python-2.7,list,dictionary,Python,Python 2.7,List,Dictionary,所以我有一个字典列表: 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'

所以我有一个字典列表:

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'}
有没有简单易行的方法来实现这一点?

我会首先创建一个defaultdict来收集国家/地区键下整数列表中的值

然后我将创建一个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 I转换为float,但您可以通过执行

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

{'PT': '67', 'FR': '25', 'UK': '33'}
我将首先创建一个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 I转换为float,但您可以通过执行

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

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

使用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}

使用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}