簡體   English   中英

Python - 平均所有具有相同鍵的鍵值到字典

[英]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 會與自己平均,然后組合在一個鍵中。 做這樣的事情的最佳方法是什么?

聚合相似鍵的一個好方法是使用帶有listdefaultdict

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM