利用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
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
· 对象命名为何需要避免'-er'和'-or'后缀
· “你见过凌晨四点的洛杉矶吗?”--《我们为什么要睡觉》
· 编程神器Trae:当我用上后,才知道自己的创造力被低估了多少
· C# 从零开始使用Layui.Wpf库开发WPF客户端
· C#/.NET/.NET Core技术前沿周刊 | 第 31 期(2025年3.17-3.23)
· 接口重试的7种常用方案!