掘金 人工智能 07月26日 09:40
苦练Python第32天:Python百宝箱,collections模块5大杀器
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文深入探索了Python的collections模块,这是一个包含专用容器数据类型的宝库。文章详细介绍了Counter、defaultdict、OrderedDict、deque和namedtuple这五种强大的工具。通过简洁的示例,展示了如何利用Counter轻松统计元素出现次数,defaultdict避免 KeyError 异常,OrderedDict(在Python 3.7之前)保持键值插入顺序,deque实现双端高效增删,以及namedtuple创建带字段名的轻量级数据对象。这些工具旨在帮助开发者编写更优雅、更高效的代码,特别是在日志分析等实际场景中,collections模块能显著提升开发效率和代码性能。

✨ **Counter:高效统计元素频率** Counter是collections模块中的一个计数器,能够方便地统计可迭代对象中各个元素的出现次数。例如,在处理文本或日志数据时,可以轻松获取单词或IP地址的频率,并能直接访问特定元素的计数,如`count['apple']`。这为数据分析提供了极大的便利。

💡 **defaultdict:告别KeyError** defaultdict是collections模块提供的一种字典类型,它允许为不存在的键设置一个默认值。当尝试访问一个不存在的键时,defaultdict不会抛出KeyError,而是根据预设的默认工厂(如`int`、`list`、`set`)返回一个默认值,这使得代码更加健壮和简洁,避免了繁琐的键存在性检查。

🔄 **deque:双端队列的效率** deque(双端队列)是collections模块中的一个高效数据结构,特别适合在队列、栈或滑动窗口等场景中使用。它支持在队列的两端进行快速的添加和删除操作(如`append`、`appendleft`、`pop`、`popleft`),比列表在两端操作时更为高效。

📦 **namedtuple:为元组赋予名字** namedtuple允许用户创建轻量级的数据对象,这些对象像元组一样不可变,但可以通过字段名来访问元素,提高了代码的可读性和自解释性。例如,`Person = namedtuple('Person', 'name age')`创建了一个可以像`p.name`这样访问的结构,无需定义完整的类。

📜 **OrderedDict:保持插入顺序(Python 3.7前)** 在Python 3.7版本之前,标准的字典并不保证元素的插入顺序。OrderedDict则解决了这个问题,它能够记住键值对的插入顺序,确保在迭代时按照插入的顺序访问元素。尽管自Python 3.7起,普通字典已默认保留插入顺序,但在旧版本环境中,OrderedDict仍然是必需的。

前言

大家好,我是倔强青铜三。欢迎关注我,微信公众号:倔强青铜三。欢迎点赞、收藏、关注,一键三连!!!

欢迎来到 苦练Python第32天
今天,我们打开 Python 的 collections 模块——一座超越 dictlisttupleset 的高性能数据结构宝库。
一起拆解最实用的五大工具,配合简洁示例,让代码更优雅、运行更快。🧠


📦 什么是 collections 模块?

collections 是 Python 内置库,提供 专用容器数据类型,助你写出更干净、更高效的代码。
本文重点聚焦五大成员:

    CounterdefaultdictOrderedDictdequenamedtuple

1. 🔢 Counter —— 计数如此简单

Counter 用于统计可迭代对象中各元素出现次数。

✅ 示例

from collections import Counterfruits = ['apple', 'banana', 'apple', 'orange', 'banana', 'apple']count = Counter(fruits)print(count)

🧪 输出

Counter({'apple': 3, 'banana': 2, 'orange': 1})

读取单个计数:

print(count['apple'])  # 3

2. 🧰 defaultdict —— 拒绝 KeyError

defaultdict 允许为缺失键设置 默认值类型,无需手动检查键是否存在。

✅ 示例

from collections import defaultdictgrades = defaultdict(int)grades['Alice'] += 1grades['Bob'] += 5print(grades)

🧪 输出

defaultdict(<class 'int'>, {'Alice': 1, 'Bob': 5})

你也可以使用 listset 或自定义函数作为默认工厂。


3. 📜 OrderedDict —— 记住插入顺序(Python 3.7 之前)

在旧版本 Python 中(3.7 之前),普通 dict 不保证 插入顺序。
OrderedDict 可确保顺序不变。

✅ 示例

from collections import OrderedDictod = OrderedDict()od['a'] = 1od['b'] = 2od['c'] = 3print(od)

🧪 输出

OrderedDict([('a', 1), ('b', 2), ('c', 3)])

注:自 Python 3.7 起,普通 dict 已保留插入顺序。


4. 🔄 deque —— 双端高效增删

deque(double-ended queue)是一个 双端队列,在两端添加/删除元素都非常高效。

✅ 示例

from collections import dequedq = deque([1, 2, 3])dq.append(4)       # 右侧追加dq.appendleft(0)   # 左侧追加print(dq)  # deque([0, 1, 2, 3, 4])dq.pop()       # 移除右侧dq.popleft()   # 移除左侧

非常适合 队列滑动窗口 场景。


5. 🧱 namedtuple —— 带字段名的元组

无需定义完整类,即可创建 轻量级、可读性强 的数据对象。

✅ 示例

from collections import namedtuplePerson = namedtuple('Person', 'name age')p = Person('Alice', 30)print(p.name)  # Aliceprint(p.age)   # 30

行为类似元组,却更 自解释


🧠 速查表

集合类型作用类比
Counter统计元素出现次数频次映射表
defaultdict避免键缺失异常带默认值的字典
OrderedDict按插入顺序保存键值(旧版本)有序映射
deque双端高效增删更快的列表
namedtuple给元组字段起名轻量级类

🔍 实战场景:日志分析

假设要统计访问日志中 IP 出现次数:

from collections import Counterwith open("access.log") as f:    ips = [line.split()[0] for line in f]ip_counts = Counter(ips)print(ip_counts.most_common(5))  # 输出前 5 名 IP

🧪 动手练

使用 Counter 实现单词计数:

text = "hello world hello hello code world python code"# 你的代码:输出每个单词的出现次数

最后感谢阅读!欢迎关注我,微信公众号倔强青铜三。欢迎点赞收藏关注,一键三连!!!

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

Python collections 数据结构 编程技巧 Python模块
相关文章