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})六、常见注意点 大小写敏感:
A 和 a 是两个不同元素。
不存在的键返回 0:普通字典会抛 KeyError,Counter 不会。
元素必须可哈希:不能统计列表、字典这类不可哈希对象。
顺序:Python3.7+ 字典有序,Counter 也会保留插入顺序;低版本无序。
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))