news 2026/8/20 17:15:36

Python进阶 - collections模块 计数器Counter的使用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python进阶 - collections模块 计数器Counter的使用

👋 大家好,欢迎来到我的技术博客!
📚 在这里,我会分享学习笔记、实战经验与技术思考,力求用简单的方式讲清楚复杂的问题。
🎯 本文将围绕Python进阶这个话题展开,希望能为你带来一些启发或实用的参考。
🌱 无论你是刚入门的新手,还是正在进阶的开发者,希望你都能有所收获!


文章目录

  • Python进阶:collections模块计数器Counter的深度使用 🐍📊
    • 什么是 Counter?🔍
    • 创建 Counter 的多种方式 🛠️
      • 1. 从可迭代对象创建 ✅
      • 2. 从字典创建 🔢
      • 3. 使用关键字参数创建 📥
      • 4. 从另一个 Counter 创建 🔄
    • Counter 的核心方法详解 💡
      • 1. `Counter.update()` —— 更新计数 🔄
      • 2. `Counter.most_common(n)` —— 获取前 N 个高频元素 🏆
      • 3. `Counter.keys()`, `values()`, `items()` —— 基础访问 📋
      • 4. `Counter.clear()` —— 清空所有计数 🧹
      • 5. `Counter.subtract()` —— 减法操作 🔻
    • Counter 的算术运算 🧮
      • 1. 加法:`+` 和 `update()` 等价 ✅
      • 2. 减法:`-` 和 `subtract()` 等价 🔻
      • 3. 交集:`&` 取最小值 🤝
      • 4. 并集:`|` 取最大值 🤝
    • 实战案例:文本词频分析 📚
    • 实战案例:用户行为日志分析 🕹️
    • Mermaid 图表:词频分布可视化 📊
    • 高级技巧:结合其他模块使用 🧩
      • 1. 与 `pandas` 联合使用(数据科学常用)
      • 2. 与 `NLTK` 一起做自然语言处理 🧠
    • 性能对比:Counter vs 手动字典 🚀
    • 常见陷阱与最佳实践 ⚠️
      • ❌ 陷阱1:误以为 `Counter` 会自动过滤负数
      • ❌ 陷阱2:忘记 `most_common()` 返回的是列表
      • ✅ 最佳实践建议:
    • 总结:为什么你应该掌握 Counter?🌟
    • 扩展阅读 📚

Python进阶:collections模块计数器Counter的深度使用 🐍📊

在日常的编程工作中,我们经常需要统计某个元素出现的次数。比如分析一段文本中每个单词出现的频率、统计用户行为日志中的操作类型分布、或者对数据集进行简单的频次分析。虽然可以用字典手动实现计数逻辑,但这样做不仅代码冗长,还容易出错。幸运的是,Python 提供了collections模块中的Counter,它是一个专为计数设计的高效工具类,极大地简化了这类任务。


什么是 Counter?🔍

Countercollections模块中的一个字典子类,专门用于计算可哈希对象的出现次数。它的底层基于字典实现,但提供了许多便捷的方法来处理计数相关的操作,如加减、取最大值、获取前N个高频项等。

fromcollectionsimportCounter# 基本用法:传入一个可迭代对象text="hello world hello python"counter=Counter(text.split())print(counter)# 输出: Counter({'hello': 2, 'world': 1, 'python': 1})

可以看到,Counter自动将每个单词作为键,出现次数作为值,实现了自动计数。这比手动遍历并更新字典要简洁得多。


创建 Counter 的多种方式 🛠️

1. 从可迭代对象创建 ✅

最常见的方式是直接传入一个列表、元组、字符串等可迭代对象。

fromcollectionsimportCounter# 从字符串创建(按字符计数)chars=Counter("abracadabra")print(chars)# Output: Counter({'a': 5, 'b': 2, 'r': 2, 'c': 1, 'd': 1})# 从列表创建fruits=['apple','banana','apple','orange','banana','apple']fruit_counter=Counter(fruits)print(fruit_counter)# Output: Counter({'apple': 3, 'banana': 2, 'orange': 1})

2. 从字典创建 🔢

如果你已经有一个计数映射,也可以直接传入字典。

data={'x':4,'y':2,'z':1}counter=Counter(data)print(counter)# Output: Counter({'x': 4, 'y': 2, 'z': 1})

3. 使用关键字参数创建 📥

支持通过关键字参数初始化,适合少量元素的快速创建。

counter=Counter(a=3,b=2,c=1)print(counter)# Output: Counter({'a': 3, 'b': 2, 'c': 1})

4. 从另一个 Counter 创建 🔄

可以将一个Counter作为输入,实现合并或复制。

c1=Counter('hello')c2=Counter('world')combined=c1+c2print(combined)# Output: Counter({'l': 2, 'h': 1, 'e': 1, 'o': 2, 'w': 1, 'r': 1, 'd': 1})

Counter 的核心方法详解 💡

1.Counter.update()—— 更新计数 🔄

update()方法允许你向已有的Counter添加新的计数,相当于“增量”操作。

counter=Counter(['a','b','a'])print(counter)# Counter({'a': 2, 'b': 1})# 添加新元素counter.update(['a','c','c'])print(counter)# Counter({'a': 3, 'b': 1, 'c': 2})

⚠️update()不会覆盖原有值,而是累加。如果某个键不存在,会自动创建并设为1。

2.Counter.most_common(n)—— 获取前 N 个高频元素 🏆

这是Counter最实用的方法之一,常用于数据分析和可视化。

sentence="the quick brown fox jumps over the lazy dog and the fox is quick"words=sentence.split()word_counter=Counter(words)# 获取最常见的前3个词top3=word_counter.most_common(3)print(top3)# Output: [('the', 3), ('quick', 2), ('fox', 2)]

你可以将结果用于生成柱状图、词云等,非常适合自然语言处理场景。

3.Counter.keys(),values(),items()—— 基础访问 📋

这些方法与普通字典一致,但返回的是有序的计数信息。

counter=Counter(['x','y','x','z','y','x'])print("Keys:",list(counter.keys()))# ['x', 'y', 'z']print("Values:",list(counter.values()))# [3, 2, 1]print("Items:",list(counter.items()))# [('x', 3), ('y', 2), ('z', 1)]

4.Counter.clear()—— 清空所有计数 🧹

重置计数器,清空所有数据。

counter=Counter('abcabc')print(counter)# Counter({'a': 2, 'b': 2, 'c': 2})counter.clear()print(counter)# Counter()

5.Counter.subtract()—— 减法操作 🔻

update()相反,subtract()用于减去指定数量的计数。

c1=Counter({'a':5,'b':3})c2=Counter({'a':2,'b':1,'c':1})c1.subtract(c2)print(c1)# Counter({'a': 3, 'b': 2, 'c': -1})

注意:结果中可能出现负数!这表示某个元素在减法后数量不足。


Counter 的算术运算 🧮

Counter支持多种算术操作,使得多个计数器之间的合并、差集、交集变得非常直观。

1. 加法:+update()等价 ✅

c1=Counter('abc')c2=Counter('bcd')result=c1+c2print(result)# Counter({'b': 2, 'c': 2, 'a': 1, 'd': 1})

❗ 注意:加法会保留所有键,即使某个键在其中一个Counter中不存在。

2. 减法:-subtract()等价 🔻

c1=Counter('abc')c2=Counter('bc')result=c1-c2print(result)# Counter({'a': 1})

📌 结果中只保留正数项。负数会被忽略,即不显示。

3. 交集:&取最小值 🤝

c1=Counter('aaabb')c2=Counter('aabbb')intersection=c1&c2print(intersection)# Counter({'a': 2, 'b': 2})

✅ 取两个Counter中对应键的最小值。

4. 并集:|取最大值 🤝

c1=Counter('aaabb')c2=Counter('aabbb')union=c1|c2print(union)# Counter({'a': 3, 'b': 3})

✅ 取两个Counter中对应键的最大值。


实战案例:文本词频分析 📚

让我们用Counter来分析一段英文文本的词汇频率。

fromcollectionsimportCounterimportre# 模拟一段英文文章text=""" Python is a high-level programming language. It is widely used for web development, data analysis, artificial intelligence, and scientific computing. Python's syntax is simple and readable. Many developers love Python because it is powerful yet easy to learn. """# 清理文本:转小写 + 移除标点 + 分词cleaned_text=re.sub(r'[^\w\s]','',text.lower())words=cleaned_text.split()# 统计词频word_counter=Counter(words)# 输出前10个高频词print("Top 10 most common words:")forword,countinword_counter.most_common(10):print(f"{word}:{count}")

输出示例:

Top 10 most common words: python: 4 is: 3 it: 2 for: 2 web: 1 development: 1 data: 1 analysis: 1 artificial: 1 intelligence: 1

💡 这种方式特别适合做关键词提取、摘要生成、甚至构建推荐系统中的内容标签。


实战案例:用户行为日志分析 🕹️

假设我们有一个游戏服务器的日志,记录玩家的操作类型:

fromcollectionsimportCounter actions=['attack','defend','heal','attack','move','attack','heal','defend','move','heal','attack','defend']action_counter=Counter(actions)print("Action frequency:")foraction,countinaction_counter.most_common():print(f"{action}:{count}")# 生成性能报告total_actions=sum(action_counter.values())print(f"\nTotal actions:{total_actions}")print(f"Most frequent action:{action_counter.most_common(1)[0][0]}")

输出:

Action frequency: attack: 4 defend: 3 heal: 3 move: 2 Total actions: 12 Most frequent action: attack

这个例子展示了如何快速洞察用户行为模式,可用于优化游戏平衡或个性化推荐。


Mermaid 图表:词频分布可视化 📊

我们可以用 Mermaid 生成一个简单的词频分布图,帮助理解数据结构。

渲染错误:Mermaid 渲染失败: Parse error on line 2: ...aph LR A[Word: "python"] --> B[Count ----------------------^ Expecting 'SQE', 'DOUBLECIRCLEEND', 'PE', '-)', 'STADIUMEND', 'SUBROUTINEEND', 'PIPE', 'CYLINDEREND', 'DIAMOND_STOP', 'TAGEND', 'TRAPEND', 'INVTRAPEND', 'UNICODE_TEXT', 'TEXT', 'TAGSTART', got 'STR'

📌 该图表展示了前5个高频词及其出现次数,直观反映文本重点。


高级技巧:结合其他模块使用 🧩

1. 与pandas联合使用(数据科学常用)

importpandasaspdfromcollectionsimportCounter data=['red','blue','green','red','blue','red']counter=Counter(data)# 转换为 DataFramedf=pd.DataFrame(counter.items(),columns=['Color','Count'])print(df)# 排序df_sorted=df.sort_values(by='Count',ascending=False)print(df_sorted)

输出:

Color Count 0 red 3 1 blue 2 2 green 1 Color Count 0 red 3 1 blue 2 2 green 1

这为后续的数据可视化(如用 Matplotlib 或 Plotly)打下基础。

2. 与NLTK一起做自然语言处理 🧠

虽然这里不展示完整流程,但CounterNLTK中分词后统计的重要工具。

fromnltk.tokenizeimportword_tokenizefromcollectionsimportCounter text="Natural language processing is fascinating!"tokens=word_tokenize(text.lower())# 统计词频freq=Counter(tokens)print(freq)

🔗 NLTK 官方文档 提供了丰富的文本处理功能。


性能对比:Counter vs 手动字典 🚀

为了验证Counter的优势,我们做个简单性能测试:

importtimefromcollectionsimportCounter# 生成大量随机数据data=['item'+str(i%100)foriinrange(100000)]# 方法一:手动字典计数start=time.time()manual_count={}foritemindata:manual_count[item]=manual_count.get(item,0)+1manual_time=time.time()-start# 方法二:使用 Counterstart=time.time()counter=Counter(data)counter_time=time.time()-startprint(f"Manual dict:{manual_time:.4f}秒")print(f"Counter:{counter_time:.4f}秒")print(f"Counter 快了{manual_time/counter_time:.2f}倍")

通常情况下,Counter会更快,因为它内部做了优化,且代码更简洁。


常见陷阱与最佳实践 ⚠️

❌ 陷阱1:误以为Counter会自动过滤负数

c1=Counter('aabb')c2=Counter('abcc')c3=c1-c2print(c3)# Counter({'a': 1, 'b': 1}) → 负数被忽略

✅ 正确做法:如果需要保留负数,应使用subtract()并手动处理。

❌ 陷阱2:忘记most_common()返回的是列表

counter=Counter('hello')top=counter.most_common(1)print(type(top))# <class 'list'>print(top[0])# ('l', 2)

✅ 应当用索引访问,或解包:word, count = top[0]

✅ 最佳实践建议:

  • 优先使用Counter处理计数问题。
  • most_common()快速获取高频项。
  • +-实现集合运算。
  • 在大型数据中,避免频繁调用Counter构造函数。

总结:为什么你应该掌握 Counter?🌟

Counter不只是一个“计数器”,而是一个强大、灵活、高效的工具,适用于:

  • 文本分析与自然语言处理
  • 日志统计与用户行为分析
  • 数据清洗与预处理
  • 机器学习特征工程
  • 快速原型开发

它让原本复杂的“计数逻辑”变得极简,提升了代码可读性与维护性。

🎯 记住:当你需要统计“某物出现了多少次”时,第一个想到的应该是Counter


扩展阅读 📚

  • Python 官方文档 - collections.Counter
  • Real Python - Working with Counter
  • [GeeksforGeeks - Python Counter](https://www.geeksforgeeks.org/python-counter/

这些资源提供了更多高级用法和真实项目案例,值得深入学习。


现在,轮到你了!
尝试用Counter分析你最近写的代码、聊天记录、甚至日记,看看哪些词最常出现吧!

👉 用一句:“I love using Counter!” 开始你的计数之旅吧!🚀


🙌 感谢你读到这里!
🔍 技术之路没有捷径,但每一次阅读、思考和实践,都在悄悄拉近你与目标的距离。
💡 如果本文对你有帮助,不妨 👍点赞、📌收藏、📤分享给更多需要的朋友!
💬 欢迎在评论区留下你的想法、疑问或建议,我会一一回复,我们一起交流、共同成长 🌿
🔔 关注我,不错过下一篇干货!我们下期再见!✨

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/20 17:11:26

Axure RP 11汉化完整指南:用 axure-cn 语言包四步换回纯中文界面

Axure RP 11汉化完整指南&#xff1a;用 axure-cn 语言包四步换回纯中文界面 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 你有…

作者头像 李华
网站建设 2026/8/20 17:07:58

TLSe 的 TLS 1.3 支持现状:实验性特性、0-RTT 缺失与未来展望

TLSe 的 TLS 1.3 支持现状&#xff1a;实验性特性、0-RTT 缺失与未来展望 【免费下载链接】tlse Single C file TLS 1.2/1.3 implementation, using tomcrypt as crypto library 项目地址: https://gitcode.com/gh_mirrors/tl/tlse TLSe 是一个用单个 C 文件实现的 TLS …

作者头像 李华
网站建设 2026/8/20 17:04:51

Ice RoamKeyScanner 源码精读:AST 如何自动识别节点的数据读写

Ice RoamKeyScanner 源码精读&#xff1a;AST 如何自动识别节点的数据读写 【免费下载链接】ice Rule engine/process engine, committed to solving flexible and complex hard-coded problems, for complex/flexibly changing business, provide a new abstract orchestratio…

作者头像 李华
网站建设 2026/8/20 17:03:52

论文科研绘图不用愁|PaperXie AI智能绘图,零基础搞定全品类学术配图

在毕业论文撰写、课题研究、期刊发表的过程中&#xff0c;科研配图是体现论文专业性、完整性、逻辑性的核心部分。规范清晰的流程图、数据图、机制示意图&#xff0c;不仅能让论文内容更直观、更有说服力&#xff0c;也是答辩评分、期刊审核、校内抽检的重要加分项。但对于绝大…

作者头像 李华
网站建设 2026/8/20 16:57:06

单片机毕设选题推荐:基于 STM32 或 51 单片机自动 / 手动双模式智能感应门控制器设计 基于 STM32 或 51 单片机声光提醒智能自动门软硬件系统实现(012404)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机&#xff0c;Java、小程序技术领域和毕业项目实战 ✌️…

作者头像 李华