使用 python 字典计算频率并计算平均值

Using a python dictionary to count a frequency and calculate a mean

我正在寻找使我的代码更具可读性的方法。我正在从包含不同语言的不同短语和与该短语关联的值的词典列表中读取信息。我想计算每种语言分数的平均值。我想创建一个新词典,其中键是语言,值是每种语言的平均分数。

示例:

输入:

d1={language:fr, score:2}
d2={language:de, score:5}
d3={language:de, score:7}
d4={language:fr, score:8}
list=[d1,d2,d3,d4]

输出为:

d5={fr:5, de:6}

到目前为止,我首先遍历了列表,创建了一个字典,其中键是语言,值是一个元组,其中包含分数的总和以及我们看到这种特定语言的次数。

然后我重复了同一个字典,将元组的第一个元素(分数的总和)与第二个元素(我们在这种语言中看到分数的次数)相除以计算平均值。

我想应该有更好的方法来计算均值。

new_d={defaultdict(lambda[0.0,0.0])}


for dictionary in list:
    new_d[dictionary[language]][0]+=dictionary[score]
    new_d[dictionary[language]][1]+=1
for key in new_d:
    new_d[key]=new_d[key][0]/new_d[key][1]
print(new_d)

谢谢!

计算均值的其他选项是使用 statistics.mean. Here in my example I combine it with itertools.groupby 计算输出字典(单行):

from statistics import mean
from itertools import groupby

d1={'language':'fr', 'score':2}
d2={'language':'de', 'score':5}
d3={'language':'de', 'score':7}
d4={'language':'fr', 'score':8}
lst=[d1,d2,d3,d4]

out = {v: mean(i['score'] for i in g) for v, g in groupby(sorted(lst, key=lambda k: k['language']), key=lambda k: k['language'])}
print(out)

打印:

{'de': 6, 'fr': 5}

您也可以使用 pandasnumpy 模块 - 它会更有效地处理大型数据集。

你可以试试这个,它比另一个答案更具可读性:

from statistics import mean


d1={'language':'fr', 'score':2}
d2={'language':'de', 'score':5}
d3={'language':'de', 'score':7}
d4={'language':'fr', 'score':8}

list1=[d1,d2,d3,d4]

languages = set(element['language'] for element in list1)
out = {}
for language in languages:
    out[language] = mean(element['score'] for element in list1 if element['language'] == language)

print(out)
>>> {'de': 6, 'fr': 5}