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

Python collections.Counter 超详细讲解

Python collections.Counter 超详细讲解

文章目录

  • Python collections.Counter 超详细讲解
  • 一、基本导入
  • 二、创建 Counter 对象(5 种常用方式)
    • 1. 传入可迭代对象(最常用:字符串 / 列表 / 元组)
    • 2. 传入字典(key = 元素,value = 计数)
    • 3. 传入关键字参数
    • 4. 空 Counter
    • 5. 从可迭代对象拆分(生成器 / 集合等)
  • 三、核心特性 & 基础用法
    • 1. 像字典一样取值、遍历
    • 2. 元素更新计数(update())
    • 3. 减少计数(subtract())
  • 四、常用内置方法(高频面试 / 开发用法)
    • 1. most_common(n) 🔥 最高频方法
    • 2. elements() 还原原可迭代对象
    • 3. keys() / values() / items()
    • 4. clear() 清空计数器
    • 5. total() 求和所有计数(Python3.10+ 新增)
  • 五、集合运算(Counter 支持加减、交、并)
    • 1. 加法 +:计数相加
    • 2. 减法 -:计数相减(负数直接剔除)
    • 3. 交集 &:取两者最小计数
    • 4. 并集 |:取两者最大计数
  • 六、常见注意点 大小写敏感:
  • 七、拓展小案例(面试常用)
    • 案例1:需求:输入字符串,按 字符(次数) 格式输出
    • 案例 2:找出列表出现次数最多的元素
    • 案例 3:统计单词词频

Counter 是 collections 模块下的可哈希对象计数器,专门用来统计 ** 可迭代对象(字符串、列表、元组等)** 中元素的出现次数,底层基于字典实现,使用极简、高频用于统计场景。

一、基本导入

fromcollectionsimportCounter

二、创建 Counter 对象(5 种常用方式)

1. 传入可迭代对象(最常用:字符串 / 列表 / 元组)

# 1. 统计字符串c1=Counter("abcbcAABBB11133")print(c1)# Counter({'B': 3, '1': 3, 'b': 2, 'c': 2, 'A': 2, '3': 2, 'a': 1})# 2. 统计列表c2=Counter([1,2,2,3,3,3])print(c2)# Counter({3: 3, 2: 2, 1: 1})# 3. 统计元组c3=Counter(("a","a","b"))print(c3)

2. 传入字典(key = 元素,value = 计数)

手动指定元素和次数:

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

3. 传入关键字参数

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

4. 空 Counter

c=Counter()# 空计数器,后续可追加元素

5. 从可迭代对象拆分(生成器 / 集合等)

c=Counter(xforxin"hello world")print(c)

三、核心特性 & 基础用法

1. 像字典一样取值、遍历

Counter 兼容字典操作:键 = 元素,值 = 出现次数

c=Counter("abcbcAABBB11133")# 1. 获取单个元素计数print(c["a"])# 1print(c["B"])# 3# 2. 访问不存在的键 → 返回 0(不会报错,区别于普通字典)print(c["x"])# 0# 3. 遍历键、值、键值对forcharinc:# 遍历元素(key)print(char)fornuminc.values():# 遍历次数(value)print(num)fork,vinc.items():# 遍历 元素:次数print(f"{k}({v})")

2. 元素更新计数(update())

追加统计,不会覆盖原有计数:

c=Counter("aabb")c.update("abc")# 再追加字符串统计print(c)# Counter({'a': 3, 'b': 3, 'c': 1})# 也可传入列表/字典c.update(["b","c","c"])print(c)

3. 减少计数(subtract())

对应 update 反向操作,计数可以为负数:

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

四、常用内置方法(高频面试 / 开发用法)

1. most_common(n) 🔥 最高频方法

返回出现次数最多的前 n 个元素,格式:[(元素, 次数), …]

  • n 不传 / 传 None:返回所有元素,按次数降序
  • n=1:取出现最多的 1 个
c=Counter("abcbcAABBB11133")# 出现最多的前 2 个print(c.most_common(2))# [('B', 3), ('1', 3)]# 全部元素按次数降序排列print(c.most_common())

2. elements() 还原原可迭代对象

按计数重复返回元素,返回迭代器,次数为 0 / 负数的元素会被忽略:

c=Counter(a=2,b=3,c=0,d=-1)print(list(c.elements()))# ['a', 'a', 'b', 'b', 'b']

3. keys() / values() / items()

和字典用法完全一致:

c=Counter("aabbcc")print(list(c.keys()))# ['a', 'b', 'c']print(list(c.values()))# [2, 2, 2]print(list(c.items()))# [('a', 2), ('b', 2), ('c', 2)]

4. clear() 清空计数器

c=Counter("abc")c.clear()print(c)# Counter()

5. total() 求和所有计数(Python3.10+ 新增)

统计元素总个数(等价于原字符串 / 列表长度):

c=Counter("abcbc")print(c.total())# 5

五、集合运算(Counter 支持加减、交、并)

规则:结果只保留计数 > 0 的元素

1. 加法 +:计数相加

c1=Counter(a=2,b=1)c2=Counter(a=1,b=3)print(c1+c2)# Counter({'b': 4, 'a': 3})

2. 减法 -:计数相减(负数直接剔除)

c1=Counter(a=2,b=1)c2=Counter(a=3,b=1)print(c1-c2)# Counter() 所有计数≤0,清空

3. 交集 &:取两者最小计数

c1=Counter(a=5,b=2)c2=Counter(a=3,b=4)print(c1&c2)# Counter({'a': 3, 'b': 2})

4. 并集 |:取两者最大计数

c1=Counter(a=5,b=2)c2=Counter(a=3,b=4)print(c1|c2)# Counter({'a': 5, 'b': 4})

六、常见注意点 大小写敏感:

  1. A 和 a 是两个不同元素。

  2. 不存在的键返回 0:普通字典会抛 KeyError,Counter 不会。

  3. 元素必须可哈希:不能统计列表、字典这类不可哈希对象。

  4. 顺序:Python3.7+ 字典有序,Counter 也会保留插入顺序;低版本无序。

  5. subtract() 允许负数计数,- 减法会直接过滤负数。

七、拓展小案例(面试常用)

案例1:需求:输入字符串,按 字符(次数) 格式输出

fromcollectionsimportCounter# 接收输入s=input("请输入字符串:")# 统计字符count=Counter(s)# 格式化拼接输出res="".join([f"{ch}({num})"forch,numincount.items()])print(res)

输入:abcbcAABBB11133
输出:a(1)b(2)c(2)A(2)B(3)1(3)3(2)

案例 2:找出列表出现次数最多的元素

fromcollectionsimportCounter lst=[1,2,2,3,3,3,4]res=Counter(lst).most_common(1)print(res[0][0])# 3

案例 3:统计单词词频

text="hello python hello world python python"words=text.split()print(Counter(words))
http://www.cnnetsun.cn/news/2656270.html

相关文章:

  • TShit.cs和Star.cs
  • 保姆级教程:在Linux服务器上配置PCIe AER,让你的系统错误无处遁形
  • 【AI工具订阅费用优化黄金法则】:20年IT架构师亲授7大降本策略,立省40%+年度支出
  • 别再一上来就让 AI 开工:先让它“拷问”你,返工真的会少很多
  • 《星辰变归来》:官方下载解锁新玩法,6.4公测打破修仙刻板印象
  • Ai2Psd:专业矢量设计工作流的关键桥梁工具
  • 2026年5月电磁流量计厂家十大品牌口碑盘点——选型推荐看这里!
  • 别再乱找激活工具了!手把手教你用记事本写一个自己的Win10 KMS激活脚本(.bat文件)
  • code-workspace是什么?
  • 硬核盘点!2026AI论文写作工具大盘点(覆盖 99% 毕业论文需求)
  • AI写教材新玩法,低查重工具助力,快速打造精品教材!
  • 别再只会用unittest了!用Pytest+Requests给你的接口测试升个级(附完整插件清单)
  • 开源项目吐槽大会:深度体验JVS低代码框架,该夸的夸,该骂的骂
  • AI专著生成秘籍大公开!4款AI工具助力,快速完成20万字专著写作!
  • 终极罗技鼠标压枪宏配置指南:3步实现PUBG职业级压枪效果
  • 如何高效下载文档:kill-doc工具终极使用指南
  • 面向AI芯片分布式系统的模型感知运行时内核:DLOS v2.0设计与评估
  • 基于ESP32-C3与太阳能供电的物联网植物监测系统全解析
  • 基于Arduino与MQ-35传感器搭建桌面空气质量监测站
  • DIY纯物理开关RGB混色灯牌:零编程实现七色光效的电子入门项目
  • 3步完成CPU单核稳定性测试:CoreCycler终极指南
  • 通用逆变板修复CCFL背光显示器:原理、适配与实战经验
  • 从零搭建低成本机器人平台:Arduino/ESP32与L298N电机驱动实战
  • 如何构建高效多平台直播弹幕采集系统:开源工具BarrageGrab的完整实战指南
  • WrenAI完整指南:如何为AI智能体构建企业数据上下文层
  • 2026.5.30-中国动力工程学会-注册,需要审核, 不知道是否免费一年会费。
  • Sora 2世界模型技术白皮书深度拆解(2024年唯一获OpenAI内部验证的第三方逆向推演)
  • 番茄小说下载器完整指南:三步实现永久离线阅读
  • 从攻击者视角复盘:DVWA在Kali上的三种部署方式(原生/Docker/PhpStudy)怎么选?
  • 别让一个DDL锁死你的生产库:Oracle大表加字段的完整避坑指南