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

Python 如何按单个单词分组并计算包含元组项的列表的平均分数?,python,list,tuples,Python,List,Tuples,我有这个列表(单词和与Word2Vec的距离)。我想按单个单词分组并计算它们的平均分数 ('marital', 0.5820825099945068) ('marital', 0.5401102304458618) ('marital', 0.5585618615150452) ('procreation', 0.5712854862213135) ('warship', 0.4743773341178894) ('benefactor', 0.48474687337875366) ('atte

我有这个列表(单词和与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])

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

您可以将列表转换为数据框,并使用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

您可以将列表转换为数据框,并使用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")

请注意,
groupby
与面向
dict
的解决方案不同,它要求分组的单词彼此相邻(因此,例如,如果在输入的末尾添加第二个
'production'
条目,它将不会与前面的条目分组)


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

没有第三方模块,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")

请注意,
groupby
与面向
dict
的解决方案不同,它要求分组的单词彼此相邻(因此,例如,如果在输入的末尾添加第二个
'production'
条目,它将不会与前面的条目分组)

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