6. Python 标准库
6.3 collections 模块
collections 模块是 Python 标准库中一个非常强大的模块,提供了许多有用的数据结构,这些数据结构是对 Python 内置数据类型(如列表、字典、集合等)的扩展和补充。collections 模块中的数据结构可以帮助开发者更高效地处理数据,尤其是在需要处理复杂数据结构时。
6.3.1 namedtuple
namedtuple 是 collections 模块中的一个工厂函数,用于创建具有命名字段的元组子类。与普通元组不同,namedtuple 允许通过字段名访问元素,而不仅仅是通过索引。这使得代码更具可读性和可维护性。
from collections import namedtuple
# 定义一个 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
6.3.2 deque
deque(双端队列)是 collections 模块中的一个类,它支持在队列的两端高效地添加和删除元素。与列表相比,deque 在两端操作的时间复杂度为 O(1),而列表在头部插入或删除元素的时间复杂度为 O(n)。
from collections import deque
# 创建一个 deque 对象
d = deque([1, 2, 3])
# 在队列的右侧添加元素
d.append(4) # deque([1, 2, 3, 4])
# 在队列的左侧添加元素
d.appendleft(0) # deque([0, 1, 2, 3, 4])
# 从队列的右侧删除元素
d.pop() # 返回 4, deque([0, 1, 2, 3])
# 从队列的左侧删除元素
d.popleft() # 返回 0, deque([1, 2, 3])
6.3.3 Counter
Counter 是 collections 模块中的一个类,用于统计可哈希对象的出现次数。Counter 本质上是一个字典的子类,键是元素,值是元素的计数。
from collections import Counter
# 创建一个 Counter 对象
c = Counter(['apple', 'banana', 'apple', 'orange', 'banana', 'apple'])
# 统计元素出现的次数
print(c) # 输出: Counter({'apple': 3, 'banana': 2, 'orange': 1})
# 获取某个元素的计数
print(c['apple']) # 输出: 3
# 获取出现次数最多的元素
print(c.most_common(2)) # 输出: [('apple', 3), ('banana', 2)]
6.3.4 defaultdict
defaultdict 是 collections 模块中的一个类,它是字典的一个子类,允许为字典中的键提供一个默认值。当访问一个不存在的键时,defaultdict 会自动创建该键,并将其值初始化为默认值。
from collections import defaultdict
# 创建一个 defaultdict,默认值为 int 类型的 0
d = defaultdict(int)
# 访问不存在的键
d['apple'] += 1
d['banana'] += 2
print(d) # 输出: defaultdict(<class 'int'>, {'apple': 1, 'banana': 2})
6.3.5 OrderedDict
OrderedDict 是 collections 模块中的一个类,它是一个有序字典,能够记住键值对的插入顺序。与普通字典不同,OrderedDict 在迭代时会按照插入顺序返回键值对。
from collections import OrderedDict
# 创建一个 OrderedDict 对象
od = OrderedDict()
od['apple'] = 1
od['banana'] = 2
od['orange'] = 3
# 按照插入顺序迭代
for key, value in od.items():
print(key, value)
# 输出:
# apple 1
# banana 2
# orange 3
6.3.6 ChainMap
ChainMap 是 collections 模块中的一个类,用于将多个字典或映射组合在一起,形成一个单一的视图。ChainMap 不会合并这些字典,而是将它们链接在一起,形成一个逻辑上的单一映射。
from collections import ChainMap
# 创建两个字典
dict1 = {'apple': 1, 'banana': 2}
dict2 = {'orange': 3, 'apple': 4}
# 创建一个 ChainMap 对象
cm = ChainMap(dict1, dict2)
# 访问键
print(cm['apple']) # 输出: 1 (从 dict1 中获取)
print(cm['orange']) # 输出: 3 (从 dict2 中获取)
6.3.7 UserDict, UserList, UserString
collections 模块还提供了 UserDict, UserList, 和 UserString 类,这些类是为了方便用户创建自定义的字典、列表和字符串类。这些类可以作为基类,用户可以通过继承它们来实现自己的数据结构。
from collections import UserDict
# 创建一个自定义字典类
class MyDict(UserDict):
def __setitem__(self, key, value):
super().__setitem__(key, value * 2)
# 使用自定义字典类
my_dict = MyDict()
my_dict['apple'] = 1
print(my_dict) # 输出: {'apple': 2}
6.3.8 总结
collections 模块提供了许多强大的数据结构,能够帮助开发者更高效地处理复杂的数据操作。无论是需要统计元素出现的次数、维护插入顺序的字典,还是需要高效的双端队列,collections 模块都能提供相应的解决方案。掌握这些数据结构的使用,可以显著提升代码的可读性和性能。
