利用Python Counter快速计算出现次数topN的元素

需要用Python写一段代码,给定一堆关键词,返回出现次数最多的n个关键字。

第一反应是采用一个dict,key存储关键词,value存储出现次数,如此一次遍历即可得出所有不同关键词的出现次数,而后排序取出前n个关键词即可。

然而仔细一思考,这种类似需求应该很常见,Python应该有提供更好的方式实现才对,于是找了下资料,发现可以使用collections模块中的Counter类实现。

Counter类继承于dict类,所以具有类似字典的行为,key存储元素,value则固定存储出现次数。

使用方法很简单,支持传入一个iterable对象初始化,以下依次是传入str,list和dict的初始化方式:

复制代码
>>> from collections import Counter
>>> ac = Counter('abcdefgabc') # str对象初始化 >>> ac Counter({'a': 2, 'c': 2, 'b': 2, 'e': 1, 'd': 1, 'g': 1, 'f': 1}) >>> ac = Counter(['abcd', 'bcde']) # list对象初始化 >>> ac Counter({'abcd': 1, 'bcde': 1}) >>> ac = Counter({'abc': 3, 'cde': 5}) # dict对象初始化 >>> ac Counter({'cde': 5, 'abc': 3})
复制代码

同时Counter支持类似dict行为的update,可以用来合并两个不同的Counter或者符合Counter要求的dict对象,如:

复制代码
>>> ac = Counter({'abc': 3, 'cde': 5})
>>> ac
Counter({'cde': 5, 'abc': 3})
>>> bc = Counter('ablmhopq')
>>> bc
Counter({'a': 1, 'b': 1, 'h': 1, 'm': 1, 'l': 1, 'o': 1, 'q': 1, 'p': 1})
>>> ac.update(bc) # 传入Counter对象update
>>> ac
Counter({'cde': 5, 'abc': 3, 'a': 1, 'h': 1, 'm': 1, 'l': 1, 'o': 1, 'q': 1, 'p': 1, 'b': 1})
>>> ac.update({'cde': 8, 'q': 2}) # 传入dict对象update
>>> ac
Counter({'cde': 13, 'abc': 3, 'q': 3, 'a': 1, 'h': 1, 'm': 1, 'l': 1, 'o': 1, 'p': 1, 'b': 1})
复制代码

而如果要返回出现次数topN的元素,Counter也已经提供了现成的方法most_common:

>>> ac.most_common(5) # 按序输出出现次数top5的元素,如不指定数字,则按序输出全部元素
[('cde', 13), ('abc', 3), ('q', 3), ('a', 1), ('h', 1)]

至此,使用者不需要关注key-value去重、计数的细节,以及最后的排序逻辑,寥寥数行代码即可完成需求。

posted @   及时  阅读(5107)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
点击右上角即可分享
微信分享提示