Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python3 Counter容器详解与使用指南

Python3 Counter容器详解与使用指南

原创
作者头像
程序熵
发布于 2025-03-25 18:05:32
发布于 2025-03-25 18:05:32
15601
代码可运行
举报
文章被收录于专栏:技术汇技术汇
运行总次数:1
代码可运行

1. 概述

Counter 是 Python 标准库 collections 模块中提供的一个高效计数工具,自 Python 2.7 版本引入并持续优化至今。

这个专为计数场景设计的容器类继承自 dict,能够自动统计可哈希对象的出现次数,特别适合进行快速统计和频次分析。

2. 核心特性

  1. 自动计数:自动维护元素到出现次数的映射。
  2. 零值处理:访问不存在的元素返回 0 而非抛出 KeyError。
  3. 高效操作:支持集合运算的计数器操作。
  4. 便捷方法:提供 most_common() 等统计专用方法。
  5. 高性能实现:基于 C 语言优化,处理百万级数据效率优异。

3. 初始化方式

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
from collections import Counter

# 空计数器
c1 = Counter()

# 通过可迭代对象初始化
c2 = Counter('gallahad')  # 统计字符出现次数

# 通过字典初始化
c3 = Counter({'red': 4, 'blue': 2})

# 通过关键字参数
c4 = Counter(cats=4, dogs=8)

# 混合初始化
c5 = Counter(['red', 'blue'], birds=3)

4. 核心方法解析

4.1 elements()

返回元素迭代器,元素按出现次数重复

代码语言:python
代码运行次数:1
运行
AI代码解释
复制
c = Counter(a=3, b=1)
sorted(c.elements())  # ['a', 'a', 'a', 'b']

4.2 most_common(n)

返回前n个最常见元素及其计数。

计数值相等的元素按首次出现的顺序排序。

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
Counter('abracadabra').most_common(3)
# [('a', 5), ('b', 2), ('r', 2)]

4.3 update() / subtract()

批量更新计数器

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
c = Counter(a=3)
c.update({'a':2, 'b':5})  # a=5, b=5
c.subtract(['a','b','c'])  # a=4, b=4, c=-1

4.4 数学运算

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
c1 = Counter(a=3, b=1)
c2 = Counter(a=1, b=2)

# 加法(合并计数)
c1 + c2  # Counter({'a':4, 'b':3})

# 减法(保留正计数)
c1 - c2  # Counter({'a':2})

# 交集(取最小值)
c1 & c2  # Counter({'a':1, 'b':1})

# 并集(取最大值)
c1 | c2  # Counter({'a':3, 'b':2})

与集合运算的差异:

代码语言:py
AI代码解释
复制
# 集合 set 运算 vs Counter 运算
s1 = {'a', 'b', 'c'}
s2 = {'b', 'c', 'd'}

# 集合交集
s1 & s2  # {'b', 'c'}

# Counter 最小交集
Counter(a=3, b=2) & Counter(b=1, c=4)  
# Counter({'b': 1}) # 取较小值,而非简单判断存在性

通过合理运用这些集合运算符,开发者可以用声明式的方式表达复杂的统计逻辑,避免大量手动循环和条件判断,显著提升代码的可读性和执行效率。

4.5 计算总数

新增于 3.10 版本。

代码语言:py
AI代码解释
复制
c = Counter(a=10, b=5, c=0)
c.total()

5. 特殊行为说明

  • 默认零值:访问缺失元素返回0但不创建键
  • 计数支持:允许0或负值计数,但elements()方法过滤非正值
  • 类型安全:元素必须为可哈希对象,计数存储为整数

6. 实战应用示例

6.1 文本分析处理

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
text1 = "the quick brown fox jumps over the lazy dog"
text2 = "the quick onyx goblin jumps over the lazy dwarf"

cnt1 = Counter(text1.split())
cnt2 = Counter(text2.split())

# 共同词汇的最小出现次数
common = cnt1 & cnt2  
# Counter({'the':2, 'quick':1, 'jumps':1, 'over':1, 'lazy':1})

# 合并所有词汇的最大出现次数
combined_max = cnt1 | cnt2  
# Counter({'the':2, 'quick':1, 'brown':1, 'fox':1, ...})

6.2 数据验证

检查两个单词是否是 相同字母异序词。

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
# 相同字母异序词
def is_anagram(word1, word2):
    return Counter(word1) == Counter(word2)

print(is_anagram('listen', 'silent'))  # True

6.3 库存管理

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
inventory = Counter(apples=10, oranges=5)
order = {'apples':7, 'oranges':3}

# 处理订单
inventory.subtract(order)
print(inventory)  # Counter({'apples':3, 'oranges':2})

# 库存报警
low_stock = [item for item, count in inventory.items() if count < 5]
print(low_stock)  # ['apples', 'oranges']

6.4 资源调度优化

代码语言:py
AI代码解释
复制
# 两个服务器节点的负载情况
node1 = Counter(CPU=80, Memory=64, Disk=90)  # 单位:%
node2 = Counter(CPU=65, Memory=72, Disk=80)

# 找出瓶颈资源(各资源的最大使用率)
bottleneck = node1 | node2  
# Counter({'Disk': 90, 'CPU': 80, 'Memory': 72})

# 计算资源池总负载
combined = node1 + node2  
# Counter({'Disk': 170, 'CPU': 145, 'Memory': 136})

7. 实现原理

  1. 哈希表存储:继承字典实现,使用开放寻址法解决哈希冲突
  2. 空间优化:自动管理哈希表大小,保证装载因子 < 2/3
  3. 方法优化most_common()使用堆排序算法优化性能

8. 性能特征

操作

时间复杂度

空间复杂度

创建Counter

O(n)

O(k)

元素访问

O(1)

O(1)

update()

O(m)

O(m)

most_common(n)

O(k log n)

O(n)

(n:元素总数,k:唯一元素数,m:更新元素数)

9. 最佳实践建议

  1. 内存优化:对大型数据集优先使用生成器初始化
  2. 数据清洗:使用+ Counter()过滤负值计数
  3. 并行计算:结合 multiprocessing 分块统计后合并

10. 典型应用场景

  • 自然语言处理:N-gram统计
  • 系统监控:请求类型计数
  • 商业分析:销售品类统计
  • 生物信息学:基因序列分析
  • 网络安全:异常请求检测

11. 注意事项

  1. 非线程安全:非原子操作,多线程需加锁
  2. JSON序列化:需先转换为普通字典
  3. 版本差异:Python 3.7+ 保证元素插入顺序
  4. 替代方案:pandas.Series 适用于带标签的数值统计

Counter作为Python标准库中的瑞士军刀级计数工具,通过合理运用可以显著提升统计类任务的开发效率和运行性能。其优雅的API设计和底层优化使其成为处理频次统计、集合运算等场景的首选工具。

参考文档

推荐阅读

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python基础-5 常用的数据结构(集合、字典)
参考手册:“set 对象是由具有唯一性的 hashable 对象所组成的无序多项集。”
一只大鸽子
2022/12/06
7640
Python标准库:超好用的counter计数器,不接受反驳!
collections是python的标准库,它提供了一些解决特定问题的容器,也就是说有些问题虽然可以用list,tuple,dict解决,但解决起来太麻烦,而这些问题又经常遇到,所以他们就把这些问题的通用方法整理了出来,放到collections库中让人使用。
快学Python
2021/08/09
1.8K0
用好collections模块,对李白诗集进行字频统计
初学Python的人很可能会遇到字频统计这样的练习题,那么很容易会想到使用for循环来做。
派大星的数据屋
2022/04/03
4100
用好collections模块,对李白诗集进行字频统计
Python标准库:超好用的counter计数器,不接受反驳!
collections是python的标准库,它提供了一些解决特定问题的容器,也就是说有些问题虽然可以用list,tuple,dict解决,但解决起来太麻烦,而这些问题又经常遇到,所以他们就把这些问题的通用方法整理了出来,放到collections库中让人使用。
秃头程序员
2021/12/14
8550
Python标准库:超好用的counter计数器,不接受反驳!
[Python技巧]是时候用 defaultdict 和 Counter 代替 dictionary 了
我们在采用 dict 的时候,一般都需要判断键是否存在,如果不存在,设置一个默认值,存在则采取其他的操作,但这个做法其实需要多写几行代码,那么是否有更高效的写法,可以减少代码,但可读性又不会降低呢,毕竟作为程序员,我们都希望写出可用并且高效简洁的代码。
kbsc13
2019/08/16
1.7K0
Counter
对于没有的元素进行查询时会返回 0 而不会报错。 如果要想把一个元素从计数器中移出,要使用del 与字典对象相比,计数器对象还有三个额外的方法:
爱编程的小明
2022/09/05
3330
python 标准类库-数据类型之集合-容器数据类型
>>> for word in ['red', 'blue', 'red', 'green', 'blue', 'blue']:
授客
2019/09/11
4140
python 标准类库-数据类型之集合-容器数据类型
Python 实用小技巧(2)
上节提到匿名函数lambda作为内置函数的参数,其中有sorted函数 此时lambda函数用于指定对列表中所有元素进行排序的准则。
数据STUDIO
2021/06/24
5020
Python -- collection
        Python拥有一些内置的数据类型,比如str, int, list, tuple, dict等, collections
py3study
2020/01/08
4870
Python collections函数
一个Counter是dict子类,用于计数可哈希的对象。这是一个无序的容器,元素被作为字典的key存储,它们的计数作为字典的value存储。Counts允许是任何证书,包括0和负数。Counter和其它语言中的bags或者multisets类似。Counter中的元素来源如下:
周小董
2019/03/25
5830
Thinking in SQL系列之数据挖掘C4.5决策树算法
作者简介:牛超 10多年数据库技术积累,长期从事ORACLE数据库管理与开发工作。精通企业级数据库应用设计、SQL、算法实现、异常分析、性能优化。目前就职于日立咨询(中国)有限公司。Mail:1
数据和云
2018/03/07
1.5K0
Thinking in SQL系列之数据挖掘C4.5决策树算法
Python collection的使用
Python中的基本数据结构有list,dict,tuple,set。Python还有一个功能比较强大的包collections,可以处理并维护一个有序的dict,可以提高程序的运行效率。 1、collections中defaultdict的使用 defaultdict在字典dict的基础之上添加一个参数default_factory(default_factory可以指定为list,set,int) 例子1:将下面的list转换成一个dict,其中key对应的value是一个list
py3study
2020/01/09
4700
Python | 原来 collections 这么好用!!
https://blog.csdn.net/mall_lucy/article/details/108822795
咸鱼学Python
2020/11/20
9120
Python | 原来 collections 这么好用!!
20个值得学习的 Python 技巧
本文为大家介绍20个值得记住的 Python 技巧,可以提升您编程技巧, 并为您节省大量时间。在平常编程过程中,以下技巧大多非常有用。
吾非同
2020/12/07
9460
20个值得学习的 Python 技巧
16 Aug 2018 python技巧分享(十五)
这是一个系列文章,主要分享python的使用建议和技巧,每次分享3点,希望你能有所收获。
俊采
2023/10/17
1360
python:collections模块中的数据结构
python中的数据结构除了内置的数据结构如列表、字典、元组、集合等之外,python的colletions内置模块中还有一些高级的数据结构,可以在特定场景下提高便利性,缩减代码量。colletions中的常用数据结果有:
生信菜鸟团
2022/01/05
5510
LeetCode 周赛上分之旅 #43 计算机科学本质上是数学吗?
因为只能交换距离偶数倍的位置,因此相当于比较两个字符串相同奇偶性下标上的元素是否相等。
用户9995743
2023/09/09
3140
LeetCode 周赛上分之旅 #43 计算机科学本质上是数学吗?
Python中collections模块学习
这个模块实现了特定目标的容器,以提供Python标准内建容器 dict、list、set、tuple 的替代选择。
北山啦
2022/11/27
4450
Python中collections模块学习
Python基本数据类型(三)
集合(set)是一个无序不重复元素的序列,基本功能是进行成员关系测试和删除重复元素,可以使用大括号({})或者 set()函数创建集合;
py3study
2020/01/08
1.1K0
学好Python,必须熟练掌握的几种数据结构
伟大先辈尼古拉斯·沃斯曾这样说过:程序=数据结构+算法,这在程序员界堪称经典的公式,其意义不亚于物理学界中的E=mc2。实际上,其意在阐明编程的核心在于掌握数据结构与算法!如果把一名优秀的程序员比作武林高手,那么数据结构即为招式,算法则是内功,二者缺一不可。当下,Python语言非常火热,学好Python就必须掌握好这些数据结构的常用用法。
luanhz
2020/12/18
1.7K0
相关推荐
Python基础-5 常用的数据结构(集合、字典)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验