如何按单个单词分组并计算包含元组项的列表的平均分数?

2024-09-25 10:21:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这个列表(单词和距离Word2Vec)。我想按单个单词分组,计算他们的平均分

('marital', 0.5820825099945068)
('marital', 0.5401102304458618)
('marital', 0.5585618615150452)
('procreation', 0.5712854862213135)
('warship', 0.4743773341178894)
('benefactor', 0.48474687337875366)
('attended', 0.5120648145675659)
('parenthood', 0.6088712811470032)
('unmarried', 0.5549637079238892)
('unmarried', 0.5597274303436279)
('unmarried', 0.5792523622512817)
('collaborator', 0.5941322445869446)
('ex-wife', 0.7367603182792664)
('ex-wife', 0.6190139055252075)
('ex-wife', 0.6742737293243408)

预期结果:

('marital', [average_score])
('procreation', 0.5712854862213135)
('warship', 0.4743773341178894)
('benefactor', 0.48474687337875366)
('attended', 0.5120648145675659)
('parenthood', 0.6088712811470032)
('unmarried', [average_score])
('collaborator', 0.5941322445869446)
('ex-wife', [average_score])

我的方法是循环所有项目,将它们和它们的分数添加到字典中,然后计算平均分数。但是,我想知道我们有没有更好的方法


Tags: 方法单词分数exscoreaveragewifeunmarried
2条回答

您可以将列表转换为数据框,并使用groupby计算平均分数

df = pd.DataFrame(list)
df.groupby([0]).agg("mean")

输出

              1
    0   
attended    0.512065
benefactor  0.484747
collaborator    0.594132
ex-wife     0.676683
marital     0.560252
parenthood  0.608871
procreation     0.571285
unmarried   0.564648
warship     0.474377

在没有第三方模块的情况下,Python提供了所需的工具:

from itertools import groupby
from operator import itemgetter
from statistics import mean

mylist = ... copy from question ...

results = []
# Group runs of values with identical words
for word, grp in groupby(mylist, key=itemgetter(0)):
    avg = mean(map(itemgetter(1), grp))  # Grab values for word and take their mean
    results.append((word, avg))
print(*results, sep="\n")

Try it online!

请注意,groupby与面向dict的解决方案不同,它要求分组的单词相邻出现(因此,例如,如果您在输入的结束处添加了第二个'procreation'条目,则不会与前面的条目分组)

如果不能保证是这样,您需要将groupby(mylist, key=itemgetter(0))更改为groupby(sorted(mylist, key=itemgetter(0)), key=itemgetter(0))以使其工作,但这将导致渐进运行时受到影响^{<预排序数据上的cd1>}是O(n)(不可能渐近击败),基于dict的解决方案是预期的O(n)(最坏情况O(n**2),但Python试图防御可能触发它的故意攻击),而groupby+sortedO(n log n),使其比预期的dict性能更差

相关问题 更多 >