news 2026/8/9 6:52:08

Python collections.Counter 用法详解:从入门到实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python collections.Counter 用法详解:从入门到实战

1. 引言

在 Python 编程中,我们经常需要对数据进行计数统计。无论是统计单词频率、分析用户行为,还是处理日志数据,计数都是一个基础而重要的操作。虽然我们可以使用字典手动实现计数功能,但 Python 标准库中的collections.Counter提供了更优雅、更高效的解决方案。

Countercollections模块中的一个字典子类,专门用于计数可哈希对象。它简化了计数操作,提供了丰富的统计方法,让我们的代码更加简洁易读。

2. Counter 的基本用法

2.1 创建 Counter 对象

创建Counter对象有多种方式:

fromcollectionsimportCounter# 方式1:从可迭代对象创建words=['apple','banana','apple','orange','banana','apple']word_counter=Counter(words)print(word_counter)# Counter({'apple': 3, 'banana': 2, 'orange': 1})# 方式2:从字典创建count_dict={'a':3,'b':2,'c':1}counter_from_dict=Counter(count_dict)print(counter_from_dict)# Counter({'a': 3, 'b': 2, 'c': 1})# 方式3:从关键字参数创建counter_from_kwargs=Counter(a=3,b=2,c=1)print(counter_from_kwargs)# Counter({'a': 3, 'b': 2, 'c': 1})# 方式4:创建空 Counterempty_counter=Counter()

2.2 访问计数结果

Counter对象的使用方式与普通字典类似:

# 访问特定元素的计数print(word_counter['apple'])# 3print(word_counter['banana'])# 2print(word_counter['orange'])# 1# 访问不存在的元素会返回 0,而不是抛出 KeyErrorprint(word_counter['grape'])# 0# 使用 get() 方法print(word_counter.get('apple',0))# 3print(word_counter.get('grape',0))# 0

3. Counter 的常用方法

3.1 elements() 方法

elements()方法返回一个迭代器,按照计数重复每个元素:

counter=Counter(a=2,b=3,c=1)elements_list=list(counter.elements())print(elements_list)# ['a', 'a', 'b', 'b', 'b', 'c']

3.2 most_common() 方法

most_common()方法返回计数最高的 n 个元素及其计数:

word_counter=Counter(['apple','banana','apple','orange','banana','apple'])# 获取所有元素的计数(按计数降序)print(word_counter.most_common())# [('apple', 3), ('banana', 2), ('orange', 1)]# 获取前 2 个最常见的元素print(word_counter.most_common(2))# [('apple', 3), ('banana', 2)]# 获取最不常见的元素(通过切片)print(word_counter.most_common()[-2:])# [('banana', 2), ('orange', 1)]

3.3 subtract() 方法

subtract()方法从计数中减去另一个可迭代对象或 Counter 的计数:

counter1=Counter(a=4,b=2,c=0,d=-2)counter2=Counter(a=1,b=2,c=3,d=4)# 从 counter1 中减去 counter2counter1.subtract(counter2)print(counter1)# Counter({'a': 3, 'b': 0, 'c': -3, 'd': -6})# 也可以减去可迭代对象counter3=Counter(a=3,b=2)counter3.subtract(['a','a','b'])print(counter3)# Counter({'a': 1, 'b': 1})

3.4 update() 方法

update()方法增加计数,与subtract()相反:

counter=Counter(a=1,b=2)counter.update(['a','b','c'])print(counter)# Counter({'a': 2, 'b': 3, 'c': 1})counter.update({'a':2,'d':3})print(counter)# Counter({'a': 4, 'b': 3, 'd': 3, 'c': 1})

4. Counter 的数学运算

Counter支持丰富的数学运算,这使得它在处理计数数据时非常强大:

c1=Counter(a=3,b=2,c=1)c2=Counter(a=1,b=2,c=3,d=4)# 加法:合并计数print(c1+c2)# Counter({'a': 4, 'b': 4, 'c': 4, 'd': 4})# 减法:只保留正计数print(c1-c2)# Counter({'a': 2})# 交集:取最小计数print(c1&c2)# Counter({'a': 1, 'b': 2, 'c': 1})# 并集:取最大计数print(c1|c2)# Counter({'a': 3, 'b': 2, 'c': 3, 'd': 4})# 一元加法和减法print(+c1)# Counter({'a': 3, 'b': 2, 'c': 1}) - 移除零和负计数print(-c2)# Counter({'a': -1, 'b': -2, 'c': -3, 'd': -4}) - 取反并移除零计数

5. 实战应用场景

5.1 文本分析:统计词频

defword_frequency(text):# 清理文本并分割单词words=text.lower().replace('.','').replace(',','').split()# 使用 Counter 统计词频word_counts=Counter(words)# 获取最常见的 10 个单词top_words=word_counts.most_common(10)returntop_words text="Python is great. Python is powerful. Python is easy to learn."result=word_frequency(text)print(result)# [('python', 3), ('is', 3), ('great', 1), ('powerful', 1), ('easy', 1), ('to', 1), ('learn', 1)]

5.2 数据分析:统计列表元素频率

# 统计考试成绩分布scores=[85,90,78,92,85,78,85,90,92,78,85,90]score_counter=Counter(scores)print("成绩分布:")forscore,countinscore_counter.most_common():print(f"{score}分:{count}人")# 找出最常见的成绩most_common_score=score_counter.most_common(1)[0]print(f"\n最常见的成绩是{most_common_score[0]}分,有{most_common_score[1]}人")

5.3 集合操作:找出共同元素

# 找出两个列表中共同出现的元素及其最小出现次数list1=['a','b','c','a','b','a']list2=['a','b','b','c','c','c']counter1=Counter(list1)counter2=Counter(list2)# 交集:共同元素的最小计数common=counter1&counter2print("共同元素及其最小出现次数:",dict(common))# {'a': 1, 'b': 2, 'c': 1}# 找出只在 list1 中出现的元素only_in_list1=counter1-counter2print("只在 list1 中出现的元素:",dict(only_in_list1))# {'a': 2}

5.4 数据验证:检查是否为子集

defis_subset(list1,list2):""" 检查 list1 是否是 list2 的子集(考虑元素重复) """counter1=Counter(list1)counter2=Counter(list2)# 如果 counter1 - counter2 为空,则 list1 是 list2 的子集returnnot(counter1-counter2)# 测试list1=['a','a','b']list2=['a','b','c','a','b']list3=['a','a','a','b']print(is_subset(list1,list2))# Trueprint(is_subset(list1,list3))# False(需要 3 个 'a',但只有 2 个)print(is_subset(list3,list2))# False

6. 性能考虑与最佳实践

6.1 性能优势

Counter在底层使用字典实现,具有 O(1) 的平均时间复杂度:

  • 计数操作:O(1)
  • most_common():O(n log k),其中 k 是请求的元素数量
  • 数学运算:O(n + m),其中 n 和 m 是两个 Counter 的大小

6.2 最佳实践

  1. 使用Counter替代手动计数

    # 不推荐:手动计数manual_count={}foriteminitems:ifiteminmanual_count:manual_count[item]+=1else:manual_count[item]=1# 推荐:使用 CounterfromcollectionsimportCounter auto_count=Counter(items)
  2. 处理缺失键Counter会自动为不存在的键返回 0,无需使用get()方法或检查键是否存在。

  3. 利用数学运算:对于复杂的计数操作,优先使用Counter的数学运算而不是手动循环。

  4. 注意内存使用:对于非常大的数据集,考虑使用most_common(n)只获取前 n 个结果,而不是处理全部数据。

7. 总结

collections.Counter是 Python 中一个强大而实用的工具,它简化了计数操作,提高了代码的可读性和性能。通过本文的介绍,您应该已经掌握了:

  1. Counter的基本创建和使用方法
  2. 常用方法如elements()most_common()subtract()update()
  3. Counter支持的数学运算
  4. 多个实际应用场景
  5. 性能考虑和最佳实践

无论是进行文本分析、数据处理还是算法实现,Counter都能
更高效地完成计数任务。下次需要统计元素频率时,不妨尝试使用Counter,体验它带来的便利和效率提升。

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

AI编程助手数据管理实战:用AgentsView实现本地化会话聚合与成本分析

1. 项目缘起:当AI编程助手成为日常,我的数据焦虑与解决方案作为一名每天和代码打交道的开发者,过去一年里,我的工作流发生了翻天覆地的变化。从最初试探性地用某个AI助手写几行注释,到现在几乎离不开它来重构代码、调试…

作者头像 李华
网站建设 2026/8/9 6:48:11

Vue.js数字图书馆系统开发全流程解析

1. 项目概述这个基于Vue的数字图书馆系统是一个典型的现代化Web应用开发项目,它涵盖了从前端到后端的完整技术栈实现。作为一名参与过多个类似项目的开发者,我认为这类系统最核心的价值在于将传统图书馆服务数字化,同时利用现代Web技术提供更…

作者头像 李华
网站建设 2026/8/9 6:47:51

改进型YOLOv8n:全阶段注意力机制与轻量化重构

一、创新点总结:创新点1:首先,在骨干网络各阶段嵌入高效通道注意力(Efficient Channel Attention,ECA)模块,构建分布式特征增强机制,自适应校准通道权重以抑制背景噪声并强化多尺度缺陷响应,为后…

作者头像 李华
网站建设 2026/8/9 6:46:05

C++模板代码膨胀的成因、诊断与实战优化策略

1. 项目概述:直面C模板的“甜蜜负担”在C的世界里,模板无疑是提升代码复用性和抽象能力的利器,它让我们能写出像std::vector、std::sort这样既通用又高效的代码。然而,但凡用过模板的开发者,尤其是参与过大型项目构建的…

作者头像 李华
网站建设 2026/8/9 6:42:46

做SEO的还要用GEO吗?传统优化与AI搜索协同指南

在生成式AI搜索快速渗透的当下,很多从事SEO工作的团队经常面临一个困惑:原本成熟的流量分析工具,似乎越来越难解释品牌在AI助手或智能问答中的真实表现。这其实不是工具失效了,而是用户获取信息的逻辑发生了根本性转变&#xff1a…

作者头像 李华