当前位置: 首页 > news >正文

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,体验它带来的便利和效率提升。

http://www.jsqmd.com/news/1357780/

相关文章:

  • 盖州若麟书画工作室怎么选?亲测看了3家后的感受
  • Python+Appium移动自动化测试环境搭建全攻略与避坑指南
  • Java基本类型与包装类:内存、性能与使用场景详解
  • 鸿蒙四大存储体系高级深度对比:Preferences/RDB KV/关系型数据库/分布式存储选型架构与性能基准测试
  • Java+微信小程序实现高效会议室预约系统
  • MCP无状态更新:AI智能体基础设施的可插拔革命
  • 苹果检测数据集任务 苹果数据集 采用多模态融合的卷积神经网络(CNN)来提高检测多模态果园苹果检测数据集(RGB-红外-深度图)任务性能
  • 中国AI原生CRM市场分析报告
  • 基于Doris与AI构建非结构化数据分析系统:从向量化到智能洞察
  • 《杭州机器搬运行业合规作业指南与主流服务商盘点》
  • Unity资源逆向与调试利器:AssetRipper核心应用与实战指南
  • Vue.js数字图书馆系统开发全流程解析
  • C++ string类深度解析与高效编程实践
  • Django开发企业级HR系统:架构设计与实战优化
  • 2026黄冈瓷砖空鼓维修本地快速上门维修师傅推荐:厨卫/客厅/阳台地砖 - 屋工匠
  • 2026届必备的降重复率工具横评
  • 英伟达布局AI基站:从CUDA到SDR,开发者如何掌握6G算网融合新技能栈
  • 重新注册VS商标设计注册驳回复审要花多少钱?
  • UE5蓝图项目跨平台性能优化:从PC到安卓的实战策略
  • 信创系统架构设计与国产化实践指南
  • Linux目录操作底层原理与性能优化实践
  • SpringBoot考研管理系统开发实践与架构设计
  • Java文件IO性能对比:NIO与传统IO的真相
  • 中药材智能分拣系统 药房自动化识别与计数 深度学习目标检测框架YOLOV8训练中草药检测数据集 识别50中中药的检测识别
  • 办公室口述编程麦克风选购与配置全攻略:从硬件到实战
  • 2026聊城瓷砖空鼓维修本地优质维修师傅推荐:厨卫/客厅/阳台地砖 - 屋工匠
  • 基于SSM+Vue的九价HPV疫苗预约系统设计与实现
  • GPT-5.6 Terra/Sol:开源大模型本地部署与API兼容实践指南
  • 探究东莞网站建设哪家专业,揭秘行业背后不为人知的真相与价值
  • 基于Node.js与AI构建高自由度互动叙事系统:从故事引擎到角色管理