Python 集合模块:高级容器类型

学习使用 Python 的集合模块。掌握Counter、defaultdict、namedtuple、deque,以及如何简化复杂的数据结构。

在编辑器中尝试

概述

虽然 Python 的基本容器(列表、字典、集合和元组)足以完成大多数任务,但复杂的程序通常需要专门的数据结构。为了解决这个问题,Python 提供了内置的“collections”模块。该模块包含高性能容器数据类型,旨在更有效地解决常见的编程任务,并使用更清晰、更自记录的语法。

最有用的类是“defaultdict”,它的作用类似于普通字典,但会自动使用默认值(如空列表或整数零)初始化缺失的键,从而无需进行详细的键检查。另一个强大的功能是“Counter”类,专门针对计算可迭代中项目的出现次数进行了优化。对于快速队列和堆栈,“deque”(双端队列)在两端提供“O(1)”插入和删除,这与遭受“O(N)”移位的列表不同。

最后,该模块提供了“namedtuple”,它创建轻量级的、类似元组的对象,可以使用点表示法和传统索引进行访问(例如,“point.x”而不是“point[0]”)。这为您提供了元组的速度和不变性以及类的可读性。将集合模块合并到您的工作流程中可以保证您的代码保持优雅、高性能和干净。

代码和执行输出

使用 Counter 统计单词并使用 defaultdict 组织词典组。

collections_demo.py
在编辑器中尝试
from collections import Counter, defaultdict, namedtuple

# 1. Counter: Tallying items
votes = ["yes", "no", "yes", "yes", "no"]
vote_counts = Counter(votes)
print(f"Vote Counts: {vote_counts}")
print(f"Most common: {vote_counts.most_common(1)}")

# 2. defaultdict: Grouping values
grouped_data = defaultdict(list)
grouped_data["engineers"].append("Alice")
grouped_data["engineers"].append("Bob")
print(f"Grouped Data: {dict(grouped_data)}")

# 3. namedtuple: Clean records
Point = namedtuple("Point", ["x", "y"])
p = Point(10, 20)
print(f"Point x: {p.x}, Point y: {p.y}")
端子输出
Vote Counts: Counter({'yes': 3, 'no': 2})
Most common: [('yes', 3)]
Grouped Data: {'engineers': ['Alice', 'Bob']}
Point x: 10, Point y: 20

逐步实施

  • 通过计数器分析日志文件以计算错误发生次数
  • 使用双端队列构建优先级队列或任务调度程序
  • 使用nametuple表示坐标维度或数据记录

常见问题解答

为什么队列操作的 deque 比 list 快?

列表需要在从前面插入或删除时移动内存中的所有后续元素 (O(N))。双端队列被实现为双向链表,允许在两端进行 O(1) 操作。

我可以更改命名元组的元素吗?

不会。由于命名元组继承自标准元组,因此它们是完全不可变的。您必须使用 ._replace() 方法返回新的修改实例。

相关主题

推荐的 Python 资源

通过相关的交互式教程、备忘单和代码比较来扩展您的知识。