玩转python:通俗易懂掌握高级数据结构-collections模块之Counter

引言

Counter是Python中collections模块提供的一个强大工具,用于统计可哈希对象的出现次数。它非常适合用于频率统计、词频分析、数据聚合等场景。本文将详细介绍Counter的关键用法和特性,并通过8个丰富的案例帮助读者掌握其应用。


关键用法和特性表格
特性/方法描述
统计频率快速统计可哈希对象的出现次数。
字典子类Counterdict的子类,支持所有字典操作。
初始化使用Counter(iterable)Counter(mapping)创建。
elements()返回一个迭代器,包含所有元素(按出现次数重复)。
most_common(n)返回出现次数最多的n个元素及其计数。
update(iterable)更新计数器,增加元素的计数。
subtract(iterable)更新计数器,减少元素的计数。
算术操作支持加法(+)、减法(-)、交集(&)、并集(|)操作。

1. Counter的概念

Countercollections模块中的一个类,用于统计可哈希对象的出现次数。它的主要特点是:

  • 统计频率:快速统计元素的出现次数。
  • 字典子类:支持所有字典操作,如键值访问、更新等。
  • 高效性能:统计和更新操作的时间复杂度为O(1)。

2. Counter的用法

2.1 创建Counter
from collections import Counter# 从列表创建Counter
c = Counter(['apple', 'banana', 'apple', 'orange', 'banana', 'apple'])
print(c)  # 输出: Counter({'apple': 3, 'banana': 2, 'orange': 1})# 从字符串创建Counter
c = Counter('abracadabra')
print(c)  # 输出: Counter({'a': 5, 'b': 2, 'r': 2, 'c': 1, 'd': 1})
2.2 访问元素计数
# 访问元素的计数
print(c['a'])  # 输出: 5
print(c['z'])  # 输出: 0(不存在时返回0)
2.3 更新计数器
# 更新计数器
c.update(['a', 'b', 'a'])
print(c)  # 输出: Counter({'a': 7, 'b': 3, 'r': 2, 'c': 1, 'd': 1})

3. Counter的常见方法

3.1 elements():返回所有元素
# 返回所有元素(按计数重复)
print(list(c.elements()))  # 输出: ['a', 'a', 'a', 'a', 'a', 'a', 'a', 'b', 'b', 'b', 'r', 'r', 'c', 'd']
3.2 most_common(n):返回最常见的元素
# 返回最常见的2个元素
print(c.most_common(2))  # 输出: [('a', 7), ('b', 3)]
3.3 subtract(iterable):减少元素计数
# 减少元素计数
c.subtract(['a', 'b', 'a'])
print(c)  # 输出: Counter({'a': 5, 'b': 2, 'r': 2, 'c': 1, 'd': 1})
3.4 算术操作
# 加法操作
c1 = Counter(['a', 'b', 'a'])
c2 = Counter(['b', 'c', 'b'])
print(c1 + c2)  # 输出: Counter({'a': 2, 'b': 3, 'c': 1})# 交集操作
print(c1 & c2)  # 输出: Counter({'b': 1})

4. Counter的8个应用案例

案例1:统计词频
# 统计一段文本的词频
text = "Python is great. Python is easy. Python is powerful."
words = text.split()
word_count = Counter(words)
print(word_count)  # 输出: Counter({'Python': 3, 'is': 3, 'great.': 1, 'easy.': 1, 'powerful.': 1})
案例2:统计字符频率
# 统计字符串中字符的频率
s = "abracadabra"
char_count = Counter(s)
print(char_count)  # 输出: Counter({'a': 5, 'b': 2, 'r': 2, 'c': 1, 'd': 1})
案例3:找出最常见的元素
# 找出列表中最常见的元素
data = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
c = Counter(data)
print(c.most_common(2))  # 输出: [(4, 4), (3, 3)]
案例4:统计文件中的单词频率
# 统计文件中单词的频率
with open('example.txt', 'r') as file:words = file.read().split()word_count = Counter(words)print(word_count.most_common(5))  # 输出文件中出现频率最高的5个单词
案例5:数据聚合
# 统计多个数据集的聚合结果
data1 = ['apple', 'banana', 'apple']
data2 = ['banana', 'orange', 'banana']
c1 = Counter(data1)
c2 = Counter(data2)
combined = c1 + c2
print(combined)  # 输出: Counter({'banana': 3, 'apple': 2, 'orange': 1})
案例6:统计投票结果
# 统计投票结果
votes = ['Alice', 'Bob', 'Alice', 'Charlie', 'Bob', 'Alice']
vote_count = Counter(votes)
print(vote_count.most_common(1))  # 输出: [('Alice', 3)]
案例7:统计列表中元素的频率
# 统计列表中元素的频率
data = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
c = Counter(data)
print(c)  # 输出: Counter({4: 4, 3: 3, 2: 2, 1: 1})
案例8:统计多个计数器的交集
# 统计多个计数器的交集
c1 = Counter(['a', 'b', 'a'])
c2 = Counter(['b', 'c', 'b'])
print(c1 & c2)  # 输出: Counter({'b': 1})

总结

Counter是Python中一个非常实用的工具,能够快速统计元素的出现次数,并支持丰富的操作。通过本文的详细讲解和8个实际案例,读者可以快速掌握Counter的使用方法,并在实际项目中灵活应用。无论是词频统计、数据聚合,还是投票分析,Counter都能轻松应对!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/73505.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DeepSeek面试——分词算法

DeepSeek-V3 分词算法 一、核心算法:字节级BPE(Byte-level BPE,BBPE) DeepSeek-V3 采用 字节级BPE(BBPE) 作为核心分词算法,这是对传统 BPE(Byte Pair Encoding)算法的…

机器学习——正则化、欠拟合、过拟合、学习曲线

过拟合(overfitting):模型只能拟合训练数据的状态。即过度训练。 避免过拟合的几种方法: ①增加全部训练数据的数量(最为有效的方式) ②使用简单的模型(简单的模型学不够,复杂的模型学的太多&am…

Python:函数(一)

python函数相关的知识点 1. 函数定义与调用 定义:使用 def 关键字,后接函数名和参数列表。 def greet(name):"""打印问候语(文档字符串)"""print(f"Hello, {name}!") 调用&#xff1a…

关于Flutter中两种Widget的生命周期详解

目录 一、StatelessWidget 生命周期 二、StatefulWidget 生命周期 1. 创建阶段 2. State初始化阶段 3. 构建阶段 4. 更新阶段 5. 销毁阶段 三、核心对比与常见陷阱 四、面试回答技巧 以下是Flutter中两种核心Widget(StatelessWidget和StatefulWidget)生命周…

Linux 》》Ubuntu 18 LTS 之后的版本 修改IP地址 主机名

进入目录 /etc/netplan 修改 50-cloud-init.yaml 》保存文件后,执行以下命令应用更改: sudo netplan apply 》》 DHCP模式 修改主机名 hostnamectl set-hostname xxxx 修改cloud.cfg 防止重启主机名还原 但测试下来 不修改, 重启 也不会还…

C++基础 [三] - 面向对象三

初始化列表 首先,初始化列表是我们的祖师爷本贾尼博士为了解决在某些成员变量在定义时必须初始化的情况。这个初始化列表其实发生在构造函数之前,也就是实例化整个对象时先对所有的成员都进行了初始化 初始化的概念区分 在之前的博客学习中&#xff…

55年免费用!RevoUninstaller Pro专业版限时领取

今天,我要给大家介绍一款超给力的卸载工具——RevoUninstaller Pro。这是一款由保加利亚团队精心打造的专业级卸载软件,堪称软件卸载界的“神器”。 RevoUninstaller分为免费版和专业版。专业版功能更为强大,但通常需要付费才能解锁全部功能。…

目前人工智能的发展,判断10年、20年后的人工智能发展的主要方向,或者带动的主要产业

根据2025年的最新行业研究和技术演进趋势,结合历史发展轨迹,未来10-20年人工智能发展的主要方向及带动的产业将呈现以下六大核心趋势: 一、算力革命与底层架构优化 核心地位:算力将成为类似“新能源电池”的基础设施,…

【机器人】复现 ASGrasp 通用透明物体重建、6-DoF抓取预测

在机器人抓取领域,透明和镜面物体的抓取一直是个难题。 ASGrasp核心是两层学习型立体网络,能够同时恢复透明和镜面物体的可见部分和不可见部分的深度信息。 然后融合两层深度信息,进行重建物体,得到点云信息作为GSNet&#xff0…

2. qt写带有槽的登录界面(c++)

我们在1.Qt写简单的登录界面(c)_c qt 设计一个简单界面-CSDN博客中写了个简单的登录界面&#xff0c;但没有槽&#xff0c;在这里写一个带有槽的界面。 1.代码 代码目录如下&#xff1a; main.cpp的代码如下&#xff1a; #include "MainWindow.h" #include <Qt…

windows安装两个或多个JDK,并实现自由切换

我用两个JDK来做演示&#xff0c;分别是JDK8和JDK17(本人已安装JDK8&#xff0c;所以这里只演示JDK17的安装)。 1、下载JDK17安装 Java Downloads | Oracle 2、安装JDK17,这里忽略。直接双击软件&#xff0c;点击下一步就可以。 3、配置环境变量 在系统变量中新建一个CLASSP…

【2025最新】深度学习框架PyTorch——从入门到精通(1)下载与安装

又名&#xff1a;芜湖起飞侠的PyTorch学习记录——从起飞到坠毁 简介安装内容总览安装AnacondaAnaconda简介Anaconda下载配置环境变量验证其他配置安装matplotlib 安装 CUDA安装之前安装cuDNN 安装torchCPU 版本安装GPU 版本安装通过pip安装&#xff08;不推荐&#xff09;通过…

C++数据结构1——栈结构详解

一、栈的基本概念与特性 1. 栈的定义与特点 栈&#xff08;Stack&#xff09;是一种遵循后进先出&#xff08;LIFO, Last In First Out&#xff09;原则的线性数据结构&#xff0c;其核心特征包括&#xff1a; 单端操作&#xff1a;所有操作仅通过栈顶进行 动态存储&#xf…

【Python 数据结构 15.哈希表】

目录 一、哈希表的基本概念 1.哈希表的概念 2.键值对的概念 3.哈希函数的概念 4.哈希冲突的概念 5.常用的哈希函数 Ⅰ、直接定址法 Ⅱ、平方取中法 Ⅲ、折叠法 Ⅳ、除留余数法 Ⅴ、位与法 6.哈希冲突的解决方案 Ⅰ、开放定址法 Ⅱ、链地址法 7.哈希表的初始化 8.哈希表的元素插…

历年云南大学计算机复试上机真题

历年云南大学计算机复试机试真题 在线评测&#xff1a;传送门&#xff1a;pgcode.cn 喝饮料 题目描述 商店里有 n 中饮料&#xff0c;第 i 种饮料有 mi 毫升&#xff0c;价格为 wi。 小明现在手里有 x 元&#xff0c;他想吃尽量多的饮料&#xff0c;于是向你寻求帮助&#x…

[文献阅读] 可变形卷积DCN - Deformable Convolutional Networks

**文献信息&#xff1a;**Deformable Convolutional Networks arxiv.org/abs/1703.06211 发表于ICCV 2017&#xff0c;提出了可变形卷积DCN&#xff08;Deformable ConvNets&#xff09; 摘要 卷积神经网络&#xff08;CNN&#xff09;由于其构建模块固定的几何结构天然地局限…

德语A1学习

Hast du morgen Zeit? Wann spielen wir? Vocabulary etwas/jemanden brauchen braucht, brauchte, hat gebraucht to need something/somebody Das geht. That works./Thats OK. den ganzen Tag the entire day dieser, diese, dieses this erst just; only G…

路局的上道检修过程中,利用AI视觉技术对轨道两旁设备设施进行检修

在铁路局的上道检修过程中,利用AI视觉技术对轨道两旁设备设施(如信号设备、电缆、接触网、通信设备等)以及铁路上方的电线(如接触网、电力线)进行异常检测,可以显著提高检修效率、降低人工成本并增强安全性。以下是具体的应用方案和技术路径: 1. 应用场景 1.1 轨道两旁…

函数指针/逗号表达式/不用if语句完成的字母输出题

1.函数指针用的不是那么频繁的一个操作&#xff1a; 下面是代码演示&#xff1a; 在这个int (*jump)(int);中 jump是这个指针变量名称&#xff0c;第一个int是指针类型&#xff0c;第二个int是指的这个指针所指的函数参数是int类型的。 #include <stdio.h>// 定义一个…

uniapp报毒

uniapp打包的apk&#xff0c;装机量多了就开始报毒&#xff0c;尝试了多种解决办法都无解&#xff01;&#xff01; 去某宝&#xff0c;解决一次50-100不等&#xff0c;并且没有售后&#xff0c;掉了重新做包&#xff0c;很是无解&#xff0c;包月价格更是离谱。 为此自行测试…