我有这个列表(单词和距离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计算平均分数
输出
在没有第三方模块的情况下,Python提供了所需的工具:
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
+sorted
是O(n log n)
,使其比预期的dict
性能更差相关问题 更多 >
编程相关推荐