Python基础教程(六十)内建模块之collections:Python宝藏模块:collections,颠覆你对数据结构的认知!

深度解析Python collections模块:高效数据处理的秘密武器

Python的collections模块提供了一系列高性能、特化的容器数据类型,远超基础listdicttupleset的能力。它们为解决特定编程问题提供了更优雅、高效的方案。

1. Counter: 元素计数之王

专为计数设计。统计可迭代对象(如列表、字符串)中元素的出现次数如同儿戏。

from collections import Counter

# 统计单词频率
words = ["apple", "banana", "apple", "orange", "banana", "apple"]
word_counts = Counter(words)
print(word_counts)  # 输出: Counter({'apple': 3, 'banana': 2, 'orange': 1})

# 找出出现频率最高的2个元素
print(word_counts.most_common(2))  # 输出: [('apple', 3), ('banana', 2)]

# 轻松更新计数
new_words = ["apple", "grape", "banana"]
word_counts.update(new_words)
print(word_counts)  # 输出: Counter({'apple': 4, 'banana': 3, 'orange': 1, 'grape': 1})
2. deque: 双端队列,高效增删

列表在头部插入/删除元素效率低(O(n))。deque(双端队列)在两端进行append/pop操作都是O(1)时间复杂度,是队列、栈和滑动窗口应用的理想选择。

from collections import deque

# 创建双端队列
d = deque([2, 3, 4])
d.appendleft(1)  # 左侧添加: [1, 2, 3, 4]
d.append(5)       # 右侧添加: [1, 2, 3, 4, 5]
left_item = d.popleft()  # 左侧移除并返回: 1, 队列变为[2, 3, 4, 5]
right_item = d.pop()     # 右侧移除并返回: 5, 队列变为[2, 3, 4]

# 固定长度队列(滑动窗口模拟)
last_three = deque(maxlen=3)
for i in range(5):
    last_three.append(i)
    print(list(last_three))  # 输出: [0], [0,1], [0,1,2], [1,2,3], [2,3,4]
3. defaultdict: 智能处理缺失键

标准字典在访问不存在的键时会引发KeyErrordefaultdict在初始化时指定一个默认值工厂函数。当访问缺失键时,它自动调用这个函数生成默认值并插入字典。

from collections import defaultdict

# 默认值为0的计数器
counts = defaultdict(int)  # int() 产生 0
counts['a'] += 1
counts['b'] += 2
print(counts)  # 输出: defaultdict(, {'a': 1, 'b': 2})

# 默认值为列表的分组器
grouped_data = defaultdict(list)
data = [('a', 1), ('b', 2), ('a', 3)]
for key, value in data:
    grouped_data[key].append(value)
print(grouped_data)  # 输出: defaultdict(, {'a': [1, 3], 'b': [2]})
4. OrderedDict: 记住插入顺序的字典

在Python 3.7之前,标准dict不保证记住键的插入顺序。OrderedDict明确记录键值对插入的顺序。即使之后更新某个键的值,其位置也不会改变(除非先删除再插入)。对于依赖顺序的场景(如LRU缓存实现)至关重要。

from collections import OrderedDict

# 创建有序字典
od = OrderedDict()
od['z'] = 1
od['a'] = 2
od['c'] = 3
print(list(od.keys()))  # 输出: ['z', 'a', 'c']

# 移动键到末尾 (常用于实现LRU缓存)
od.move_to_end('z')
print(list(od.keys()))  # 输出: ['a', 'c', 'z']

# 删除并返回最后/最前键值对 (FIFO/LIFO)
od.popitem(last=True)   # 移除并返回('z', 3)
od.popitem(last=False)  # 移除并返回('a', 2)
5. namedtuple: 自解释的元组

创建具有命名字段的轻量级元组子类。代码可读性远优于普通元组,访问字段使用直观的点号.语法,同时保留元组的内存效率和不可变性。

from collections import namedtuple

# 定义一个名为'Point'的命名元组,字段为'x'和'y'
Point = namedtuple('Point', ['x', 'y'])

# 创建实例
p = Point(10, y=20)
print(p)        # 输出: Point(x=10, y=20)
print(p.x)      # 输出: 10
print(p[0])     # 输出: 10 (仍然支持索引访问)

# 不可变性尝试 (会引发AttributeError)
# p.x = 15
6. 其他实用工具
  • ChainMap 将多个字典或映射逻辑上组合成一个视图。查找时按顺序搜索底层映射。适用于管理分层配置或覆盖默认值。
  • UserDict, UserList, UserString 包装标准容器类型,作为创建自定义容器类的基类更简单(相比直接子类化dict/list/str)。
何时使用collections?
  • Counter: 计数统计、词频分析、Top N问题。
  • deque: 队列/栈实现、需要高效两端操作的场景、滑动窗口算法。
  • defaultdict: 分组聚合、构建复杂嵌套结构(如树、图邻接表)、避免繁琐的key in dict检查。
  • OrderedDict: 需要明确记录插入或访问顺序的场景(如构建LRU缓存)、配置项顺序敏感。
  • namedtuple: 替代只有简单属性的小型类、数据库记录返回、提高代码可读性、需要不可变数据。

掌握collections模块,意味着掌握Python高效处理结构化数据的核心武器库! 善用这些工具,代码更简洁、高效、可读。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

值引力

持续创作,多谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值