[英]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.