聊聊Python的一个内置模块Collections(探索Python内置模块Collections:实用功能全解析)
原创
一、概述
Python的内置模块Collections提供了许多扩展了内建容器类型(如dict、list、set和tuple)的特殊容器数据类型。这些数据类型在处理特定类型的任务时,可以提供更高效、更便捷的方法。本文将详细介绍Collections模块中的各个数据类型及其使用方法。
二、Counter
Counter是一个字典子类,用于计数可哈希对象。它是一个集合,其中元素存储为字典的键,它们的计数存储为字典的值。
from collections import Counter
# 示例数据
data = ['apple', 'banana', 'apple', 'orange', 'banana', 'banana']
# 创建Counter对象
counter = Counter(data)
# 输出导致
print(counter)
# 输出: Counter({'banana': 3, 'apple': 2, 'orange': 1})
三、defaultdict
defaultdict是另一个字典子类,它允许你指定一个默认工厂函数,当访问字典中不存在的键时,会自动创建该键并使用工厂函数初始化其值。
from collections import defaultdict
# 定义一个defaultdict,其默认工厂函数为int
dd = defaultdict(int)
# 添加元素
dd['apple'] += 1
dd['banana'] += 2
dd['orange'] += 1
# 访问不存在的键
print(dd['grape'])
# 输出: 0
# 输出导致
print(dict(dd))
# 输出: {'apple': 1, 'banana': 2, 'orange': 1, 'grape': 0}
四、OrderedDict
OrderedDict是一个字典子类,它维护了元素添加的顺序。在Python 3.7+中,普通字典也保持了插入顺序,但OrderedDict仍然有一些特有的功能。
from collections import OrderedDict
# 创建一个OrderedDict
od = OrderedDict()
od['apple'] = 1
od['banana'] = 2
od['orange'] = 1
# 按照元素添加顺序输出
for key, value in od.items():
print(key, value)
# 输出:
# apple 1
# banana 2
# orange 1
五、namedtuple
namedtuple是一个工厂函数,用于创建具有命名字段的元组子类。这样,你可以通过名称而不是索引来访问元组中的元素。
from collections import namedtuple
# 创建一个namedtuple
Point = namedtuple('Point', 'x y')
# 创建一个Point实例
p = Point(11, y=22)
# 访问字段
print(p.x)
# 输出: 11
print(p.y)
# 输出: 22
# 输出Point实例
print(p)
# 输出: Point(x=11, y=22)
六、deque
deque是一个双端队列,它拥护在两端迅速添加(append)和弹出(pop)元素。与list相比,deque在处理大量元素时具有更高的性能。
from collections import deque
# 创建一个deque
dq = deque(['apple', 'banana', 'orange'])
# 添加元素到队列前端
dq.appendleft('grape')
# 添加元素到队列后端
dq.append('watermelon')
# 弹出队列前端元素
print(dq.popleft())
# 输出: grape
# 输出队列后端元素
print(dq.pop())
# 输出: watermelon
# 输出当前队列
print(dq)
# 输出: deque(['apple', 'banana', 'orange'])
七、ChainMap
ChainMap是一个字典的集合,它将多个映射(字典)串联在一起,形成一个单一的映射。在查找键时,它会按照添加顺序在各个映射中查找。
from collections import ChainMap
# 创建两个字典
a = {'a': 1, 'b': 2}
b = {'b': 3, 'c': 4}
# 创建一个ChainMap
cm = ChainMap(a, b)
# 访问键
print(cm['a']) # 从a字典中查找
# 输出: 1
print(cm['b']) # 从a字典中找不到,从b字典中查找
# 输出: 3
print(cm['c']) # 从a字典中找不到,从b字典中查找
# 输出: 4
# 尝试访问不存在的键
# print(cm['d']) # 抛出KeyError异常
八、Counter与defaultdict结合使用
Counter和defaultdict可以结合使用,以创建一个计数器,当计数器遇到不存在的元素时,自动初始化其计数为0。
from collections import Counter, defaultdict
# 创建一个defaultdict,其值为Counter
dd_counter = defaultdict(Counter)
# 添加数据
dd_counter['apple']['red'] += 1
dd_counter['apple']['green'] += 2
dd_counter['banana']['yellow'] += 3
# 访问不存在的键
print(dd_counter['orange']['red'])
# 输出: 0
# 输出导致
print(dict(dd_counter))
# 输出: {'apple': Counter({'green': 2, 'red': 1}), 'banana': Counter({'yellow': 3})}
九、总结
Collections模块提供了许多实用的数据结构,它们在处理特定类型的任务时,可以大大尽或许减少损耗代码的高效能和可读性。通过本文的介绍,我们了解了Counter、defaultdict、OrderedDict、namedtuple、deque、ChainMap等数据类型的基本用法。在实际开发中,灵活运用这些数据类型,可以让我们更高效地解决问题。