Python:collections.Counter 常用函数及应用

在文本分析、数据统计以及自然语言处理中,经常需要对数据进行频次统计(frequency counting)。例如:

• 统计一段文本中每个单词出现的次数

• 统计日志中某类事件出现的频率

• 统计列表中元素的重复情况

Python 标准库 collections 提供了一个专门用于频次统计的数据结构:Counter。

Counter 是一个计数器对象,本质上实现了多重集合(multiset)的行为,用于记录元素出现的次数。

例如:

python 复制代码
from collections import Counter
words = ["apple", "banana", "apple", "orange", "banana", "apple"]counter = Counter(words)print(counter)

输出示例:

javascript 复制代码
Counter({'apple': 3, 'banana': 2, 'orange': 1})

• 键(key):表示被统计的元素

• 值(value):表示该元素出现的次数(计数)

Counter 基于字典实现,底层使用哈希表结构,因此对元素计数的更新与查询通常具有接近 𝑂(1) 的时间复杂度。

一、创建 Counter 对象

Counter 可以通过多种方式创建。

Counter()

创建一个 Counter 对象。

css 复制代码
Counter([iterable_or_mapping], **kwargs)

参数说明:

• iterable_or_mapping:可迭代对象(如列表、字符串)或映射对象(字典),用于初始化计数

• **kwargs:以关键字参数形式提供元素计数

返回:

返回一个 Counter 对象。若不提供参数,则创建空 Counter。

示例 1:从列表创建

python 复制代码
from collections import Counter
data = ["a", "b", "a", "c", "b", "a"]counter = Counter(data)print(counter)

输出:

javascript 复制代码
Counter({'a': 3, 'b': 2, 'c': 1})

示例 2:从字符串创建

字符串也是可迭代对象,因此可以直接统计字符频率。

makefile 复制代码
text = "hello world"counter = Counter(text)print(counter)

输出示例:

javascript 复制代码
Counter({'l': 3, 'o': 2, 'h': 1, 'e': 1, ' ': 1, 'w': 1, 'r': 1, 'd': 1})

示例 3:从字典创建

apache 复制代码
counter = Counter({"apple": 3, "banana": 2})print(counter)

输出:

javascript 复制代码
Counter({'apple': 3, 'banana': 2})

示例 4:使用关键字参数创建

apache 复制代码
counter = Counter(a=3, b=2, c=1)print(counter)

输出:

javascript 复制代码
Counter({'a': 3, 'b': 2, 'c': 1})

说明:关键字参数的形式等价于从字典创建:

apache 复制代码
Counter({"a": 3, "b": 2, "c": 1})

二、访问计数结果

Counter 的行为类似于字典,可以通过键访问元素计数。

counterelement

获取元素计数。

示例:

bash 复制代码
counter = Counter(["apple", "banana", "apple"])
print(counter["apple"])# 2

如果元素不存在,Counter 返回 0,而不是抛出异常:

bash 复制代码
print(counter["orange"])# 0

这一点与普通字典不同。

elements()

返回一个迭代器,其中每个元素按照其计数重复出现。

go 复制代码
counter.elements()

示例:

apache 复制代码
counter = Counter({"a": 3, "b": 2})print(list(counter.elements()))

输出:

css 复制代码
['a', 'a', 'a', 'b', 'b']

说明:elements() 仅返回计数大于 0 的元素,并按照元素在 Counter 中的顺序生成。

三、更新与修改计数

+Counter

Counter 可通过一元加号运算删除计数小于等于 0 的元素。

+counter 会返回一个新的 Counter 对象,其中只保留计数大于 0 的元素。

示例:

bash 复制代码
counter = Counter({'a': 2, 'b': 0, 'c': -1})print(+counter)

输出:

javascript 复制代码
Counter({'a': 2})

update()

增加元素计数。

css 复制代码
counter.update([iterable_or_mapping], **kwargs)

参数说明:

• iterable_or_mapping:可迭代对象(如列表、字符串)或映射对象(字典)

• **kwargs:以关键字参数形式增加元素计数

示例:

bash 复制代码
counter = Counter("apple")counter.update("apple")print(counter)

输出:

javascript 复制代码
Counter({'p': 4, 'a': 2, 'l': 2, 'e': 2})

说明:当传入字符串时,字符串会被视为字符序列进行统计。

subtract()

减少元素计数。

css 复制代码
counter.subtract([iterable_or_mapping], **kwargs)

参数说明:

• iterable_or_mapping:可迭代对象(如列表、字符串)或映射对象(字典)

• **kwargs:以关键字参数形式减少元素计数

示例 1:

bash 复制代码
counter = Counter("apple")counter.subtract("ap")print(counter)

输出:

javascript 复制代码
Counter({'p': 2, 'l': 1, 'e': 1, 'a': 0})

说明:subtract() 可能产生负数计数。

示例 2:

apache 复制代码
c = Counter(a=4, b=2)c.subtract(a=1, b=2)print(c)

输出:

javascript 复制代码
Counter({'a': 3, 'b': 0})

四、常用统计函数

Counter 提供了多个用于统计分析的函数。

most_common()

返回出现频率最高的元素。

python 复制代码
counter.most_common(n=None)

参数说明:

• n:返回前 n 个元素

返回:

返回一个列表,每个元素为:(element, count)。

示例:

makefile 复制代码
text = "banana"counter = Counter(text)print(counter.most_common(2))

输出:

css 复制代码
[('a', 3), ('n', 2)]

说明:结果按计数从高到低排序;若计数相同,则保持元素首次出现顺序。

total()

返回 Counter 中所有计数值的总和。

go 复制代码
counter.total()

示例:

bash 复制代码
counter = Counter("banana")print(counter.total())# 6

说明:Python 3.10 新增。

五、Counter 的数学运算

Counter 支持多重集合(multiset)运算。

1、加法

nginx 复制代码
counter1 + counter2

合并计数。

示例:

go 复制代码
c1 = Counter("apple")c2 = Counter("pear")
print(c1 + c2)# Counter({'p': 3, 'a': 2, 'e': 2, 'l': 1, 'r': 1})

2、减法

nginx 复制代码
counter1 - counter2

只保留大于 0 的计数项。

示例:

shell 复制代码
print(c1 - c2)# Counter({'p': 1, 'l': 1})

3、交集

nginx 复制代码
counter1 & counter2

取最小计数。

示例:

shell 复制代码
print(c1 & c2)# Counter({'a': 1, 'p': 1, 'e': 1})

4、并集

nginx 复制代码
counter1 | counter2

取最大计数。

示例:

shell 复制代码
print(c1 | c2)# Counter({'p': 2, 'a': 1, 'l': 1, 'e': 1, 'r': 1})

六、英文文本词频统计示例

在自然语言处理(NLP)任务中,Counter 常用于统计单词频率。

典型流程包括:

1、文本清洗

2、分词(tokenization)

3、停用词过滤

4、词频统计

示例代码:

python 复制代码
from collections import Counterimport string

text = """Artificial intelligence is transforming the world.Machine learning and deep learning are key technologies in AI.Natural language processing enables computers to understand human language."""
# 转为小写text = text.lower()
# 常见特殊符号punctuation = string.punctuation
# 将特殊符号替换为空格table = str.maketrans(punctuation, " " * len(punctuation))text = text.translate(table)
# 按空格分词words = text.split()
# 使用 Counter 统计词频freq = Counter(words)
# 逐行输出出现频率最高的 10 个词for word, count in freq.most_common(10):    print(word, count)

📘 小结

Counter 是 Python collections 模块提供的计数器对象,本质上是 dict 的子类,用于记录元素出现次数。通过 Counter()、update()、subtract()、most_common()、elements() 等方法,可以方便地完成频次统计与数据分布分析。Counter 还支持多重集合运算,如加法、减法、交集和并集。在文本分析与自然语言处理任务中,Counter 常与分词和文本清洗步骤结合使用,用于快速构建词频统计模型。

"点赞有美意,赞赏是鼓励"

相关推荐
Brilliantwxx20 分钟前
【STM32】 I2C_EEPROM_test 工程(实战篇)
开发语言·stm32·单片机·嵌入式硬件·ecmascript
清水白石00825 分钟前
Python 异步编程深度解析:Cancellation 到底是异常还是控制信号?从 asyncio 取消机制到企业级事务设计最佳实践
开发语言·python
kolyle31 分钟前
万级 QPS 下的 Token 分发系统架构:从 0 到 1 跑通 AI 时代的“水电煤“
开发语言·人工智能·系统架构·token·qps·极智词元·大模型私有化部署
caoerzhong44 分钟前
JeeWMS 开源仓库管理系统 GPL-3.0 合规指南:Java WMS 二次开发前必须弄清的授权边界
java·开发语言·开源·vue
Patrick在香港44 分钟前
Python 审计香港开放数据目录:两个端点差 10 倍,只有 9.3% 的资源标了「最后修改时间」
开发语言·数据库·python·数据分析·api·数据治理·开放数据
IT毕设梦工厂1 小时前
计算机毕业设计选题推荐:基于大数据的草鱼价格分析与可视化|毕业设计选题|计算机毕设|选题推荐|毕设指导|项目定制|源码|高质量项目
大数据·hadoop·python·数据挖掘·数据分析·课程设计·大数据毕设项目
GISHUB1 小时前
基于QGIS 3.44开发Python插件完整教程
python·qgis
大数据魔法师1 小时前
curl_cffi从入门到实战
爬虫·python
Sylvia33.1 小时前
火星数据体育API|一站式接入足球篮球电竞等18+项目实时数据
java·开发语言·python·websocket·游戏
程序员清风2 小时前
LangGraph 入门:用状态机设计可靠的 Agent 工作流
人工智能·python