利用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去重、计数的细节,以及最后的排序逻辑,寥寥数行代码即可完成需求。
签名:拥抱开源,拥抱自由
分类:
python
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端