[英]Python - Average all key values with same key to dictionary
假设我正在使用这本词典:
ratings={'Shane': {'127 Hours': 5.0, 'Avatar': 4.5}, 'Jaycee': {'127 Hours': 4.8, 'Avatar': 3.5, 'Mad Max: Fury Road': 4.9}}
我正在尝试舍入所有相同键的值并将它们输出如下:
ratings={'127 Hours': 4.9, 'Avatar': 4.0, 'Mad Max: Fury Road': 4.9}
Mad Max 保持不变,因为它没有出现在任何地方的第一本字典中可以平均计算,而 Avatar 和 127 Hours 会与自己平均,然后组合在一个键中。 做这样的事情的最佳方法是什么?
聚合相似键的一个好方法是使用带有list
的defaultdict
:
from collections import defaultdict
ratings= {
'Shane': {'127 Hours': 5.0, 'Avatar': 4.5},
'Jaycee': {'127 Hours': 4.8, 'Avatar': 3.5, 'Mad Max: Fury Road': 4.9}
}
# this creates a dictionary that sets a default value of an empty list on
# access, which makes the aggregation a bit nicer since no
# initialization is needed
by_movie = defaultdict(list)
# aggregate to the default dict
for name, mrs in ratings.items():
for movie, rating in mrs.items():
by_movie[movie].append(rating)
# calculate averages
averages = {movie: sum(movie_ratings) / len(movie_ratings) for movie, movie_ratings in by_movie.items()}
print averages
输出:
{'127 小时':4.9,'疯狂的麦克斯:狂暴之路':4.9,'阿凡达':4.0}
ratings={'Shane': {'127 Hours': 5.0, 'Avatar': 4.5},
'Jaycee': {'127 Hours': 4.8,
'Avatar': 3.5, 'Mad Max: Fury Road': 4.9}}
result = {}
for _,value in ratings.items():
for key,val in value.items():
result.setdefault(key, []).append(val)
print {i:sum(result[i])/len(result[i]) for i in result}
输出:
{'127 Hours': 4.9, 'Mad Max: Fury Road': 4.9, 'Avatar': 4.0}
因为“功能性”总是更好等等;)
from itertools import chain, groupby
from operator import itemgetter
{k: (lambda g: sum(map(itemgetter(1), g)) / len(g))(list(g))
for k, g in groupby(sorted(chain.from_iterable(map(dict.items,
ratings.values())),
key=itemgetter(0)),
itemgetter(0))}
输出:
{'127 Hours': 4.9, 'Mad Max: Fury Road': 4.9, 'Avatar': 4.0}
import itertools, operator
d = {}
for movie, items in itertools.groupby(sorted(itertools.chain(*[x.items() for x in ratings.values()])), lambda x: x[0]):
items = list(items)
d[movie] = sum(x[1] for x in items)/len(items)
给你{'127 Hours': 4.9, 'Mad Max: Fury Road': 4.9, 'Avatar': 4.0}
我不推荐它,但到底是什么。 :)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.