collections
是 Python 的一个强大内置模块,提供了多种高性能的数据类型,可以帮助开发者更高效地处理数据。本文将详细介绍 collections
模块中的各个主要组件,并附有相应的代码示例。
参考文章:Python 内置模块 collections | 简单一点学习 easyeasy.me
1. 引言
什么是 collections
模块
collections
是 Python 的一个内置模块,提供了多种用于存储数据的高级数据结构。这些数据结构扩展了 Python 内置类型的功能,使得在处理特定类型的数据时更加高效和方便。
为什么使用 collections
使用 collections
模块可以:
- 提高代码的可读性和可维护性。
- 提供更高效的数据操作方法。
- 简化复杂的数据结构管理。
2. namedtuple
简介
namedtuple
是一个工厂函数,用于创建带有字段名称的元组子类。它结合了元组的不可变性和字典的键值访问特性。
创建和使用 namedtuple
from collections import namedtuple
# 定义一个名为 'Person' 的 namedtuple
Person = namedtuple('Person', ['name', 'age', 'gender'])
# 创建一个 Person 实例
person = Person(name='Alice', age=30, gender='Female')
# 访问字段
print(person.name) # 输出: Alice
print(person.age) # 输出: 30
print(person.gender) # 输出: Female
namedtuple
的优点
- 不可变性: 类似于元组,
namedtuple
的实例是不可变的。 - 可读性: 通过字段名称访问数据,提高了代码的可读性。
- 内存效率: 比普通类更节省内存。
示例代码
from collections import namedtuple
# 定义一个名为 'Point' 的 namedtuple
Point = namedtuple('Point', ['x', 'y'])
# 创建 Point 实例
p = Point(10, 20)
# 访问字段
print(p.x, p.y) # 输出: 10 20
# 解压
x, y = p
print(x, y) # 输出: 10 20
3. deque
简介
deque
(双端队列)是一个线程安全、内存高效的双向队列,支持在两端快速添加和删除元素。
deque
的基本操作
from collections import deque
# 创建一个 deque
d = deque([1, 2, 3])
# 在右侧添加元素
d.append(4)
print(d) # 输出: deque([1, 2, 3, 4])
# 在左侧添加元素
d.appendleft(0)
print(d) # 输出: deque([0, 1, 2, 3, 4])
# 移除右侧元素
d.pop()
print(d) # 输出: deque([0, 1, 2, 3])
# 移除左侧元素
d.popleft()
print(d) # 输出: deque([1, 2, 3])
deque
的优势
- 高效: 在两端添加和删除元素的时间复杂度为 O(1)。
- 线程安全: 可以安全地在多线程环境中使用。
示例代码
from collections import deque
# 创建一个 deque
d = deque([1, 2, 3], maxlen=5)
# 添加元素
d.extend([4, 5, 6])
print(d) # 输出: deque([2, 3, 4, 5, 6], maxlen=5)
# 旋转
d.rotate(2)
print(d) # 输出: deque([5, 6, 2, 3, 4], maxlen=5)
4. Counter
简介
Counter
是一个字典子类,用于计数可哈希对象。它可以方便地统计元素出现的次数。
Counter
的常用方法
elements()
: 返回一个迭代器,重复元素其计数次数。most_common([n])
: 返回一个按元素计数降序排列的列表。subtract([iterable-or-mapping])
: 从另一个映射或可迭代对象中减去元素计数。
Counter
的应用场景
- 统计字符出现频率。
- 统计单词出现次数。
- 统计列表中元素的出现次数。
示例代码
from collections import Counter
# 统计字符串中字符出现次数
c = Counter('abracadabra')
print(c) # 输出: Counter({'a': 5, 'b': 2, 'r': 2, 'c': 1, 'd': 1})
# 获取出现次数最多的元素
print(c.most_common(3)) # 输出: [('a', 5), ('b', 2), ('r', 2)]
# 减去另一个 Counter
c.subtract({
'a': 1, 'd': 1})
print(c) # 输出: Counter({'a': 4, 'b': 2, 'r': 2, 'c': 1, 'd': 0})
5. OrderedDict
简介
OrderedDict
是一个字典子类,保留着插入元素的顺序。在 Python 3.7 及以上版本中,普通字典已经保留了插入顺序,但 OrderedDict
仍然有其独特的用途。
OrderedDict
的常用方法
move_to_end(key, last=True)
: 将指定键移动到字典的末尾或开头。popitem(last=True)
: 移除并返回最后一个或第一个键值对。
OrderedDict
与普通字典的区别
OrderedDict
提供了额外的方法来操作元素的顺序。- 在旧版本的 Python 中,
OrderedDict
是唯一保留插入顺序的字典类型。
示例代码
from collections import OrderedDict
# 创建一个 OrderedDict
od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
# 插入新的键值对
od['d'] = 4
print(od) # 输出: OrderedDict([('a', 1), ('b', 2), ('c', 3), ('d', 4)])
# 移动键 'b' 到末尾
od.move_to_end('b')
print(od) # 输出: OrderedDict([('a', 1), ('c', 3), ('d', 4), ('b', 2)])
# 移除最后一个键值对
od.popitem()
print(od) # 输出: OrderedDict([('a', 1), ('c', 3), ('d', 4)])
6. defaultdict
简介
defaultdict
是一个字典子类,提供了一个默认值用于不存在的键。它可以简化代码,避免在访问不存在的键时抛出 KeyError
。
defaultdict
的使用场景
- 统计元素出现次数。
- 创建一个嵌套的字典结构。
- 简化字典的初始化。
defaultdict
的常用方法
__missing__(key)
: 当访问不存在的键时调用,返回默认值。
示例代码
from collections import defaultdict
# 创建一个 defaultdict,默认值为列表
d = defaultdict(list)
# 添加元素
d['fruits'].append('apple')
d['fruits'].append('banana')
d['vegetables'].append('carrot')
print(d) # 输出: defaultdict(<class 'list'>, {'fruits': ['apple', 'banana'], 'vegetables': ['carrot']})
# 访问不存在的键
print(d['grains']) # 输出: []
7. ChainMap
简介
ChainMap
是一个字典的集合,提供了多个字典的视图。它可以模拟嵌套的作用域。
ChainMap
的常用方法
maps
: 返回包含所有字典的列表。new_child([m])
: 返回一个新的ChainMap
,包含一个新的字典。parents
: 返回一个新的ChainMap
,不包含第一个字典。
ChainMap
的应用场景
- 模拟嵌套字典。
- 合并多个字典。
- 动态地添加或移除字典。
示例代码
from collections import ChainMap
# 创建多个字典
dict1 = {
'a': 1, 'b': 2}
dict2 = {
'b': 3, 'c': 4}
# 创建一个 ChainMap
cm = ChainMap(dict1, dict2)
print(cm) # 输出: ChainMap({'a': 1, 'b': 2}, {'b': 3, 'c': 4})
# 访问元素
print(cm['a']) # 输出: 1
print(cm['b']) # 输出: 2
print(cm['c']) # 输出: 4
# 更新第一个字典
cm['b'] = 5
print(cm) # 输出: ChainMap({'a': 1, 'b': 5}, {'b': 3, 'c': 4})
8. UserDict, UserList, UserString
简介
UserDict
, UserList
, UserString
是用于创建自定义字典、列表和字符串的基类。它们提供了对内置类型的封装,方便进行扩展和自定义。
使用场景
- 创建自定义的数据结构。
- 封装和扩展内置类型的功能。
- 实现特定的数据处理逻辑。
示例代码
from collections import UserDict
# 创建一个自定义的字典类
class MyDict(UserDict):
def __missing__(self, key):
return f"Key '{key}' not found."
# 使用自定义的字典
md = MyDict({
'a': 1, 'b': 2})
print(md['a']) # 输出: 1
print(md['c']) # 输出: Key 'c' not found.