所以我有这个词典列表:
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'}
有没有简单易行的方法来实现这个?
答案 0 :(得分:4)
我首先创建一个defaultdict
来收集“COUNTRY”键下的整数列表中的值。
然后我将创建一个词典理解,执行平均值:
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'}
答案 1 :(得分:1)
使用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}