介绍
collections
模块是 Python 标准库的一部分,提供了多种增强的数据类型,包括 namedtuple
、deque
、Counter
、OrderedDict
、defaultdict
和 ChainMap
。
这些数据类型比内置类型更灵活高效,适用于特定场景。掌握和合理使用这些数据结构,你会发现日常开发效率会非常高。
常见数据结构
namedtuple
namedtuple
是 Python collections
模块中的一个工厂函数,用于创建具有命名字段的不可变序列。它提供了类似于元组的性能和内存效率,同时可以通过名称访问其元素,从而提高代码的可读性和可维护性。
下面通过一段关于操作 地理坐标(Geolocation) 的代码来详细说明:如何创建 namedtuple
、访问其元素,以及 namedtuple
的方法和属性。
# 导入
from collections import namedtuple
# 定义 namedtuple 类型 Geo
Geo = namedtuple('Geo', ['latitude', 'longitude'])
# 创建几个 Geo 实例
a_geo = Geo(39.9042, 116.4074)
b_geo = Geo(31.2304, 121.4737)
c_geo = Geo(23.1291, 113.2644)
# 打印地理坐标
print(f"a_geo: {
a_geo.latitude}, {
a_geo.longitude}") # 输出: a_geo: 39.9042, 116.4074
print(f"b_geo: {
b_geo.latitude}, {
b_geo.longitude}") # 输出: b_geo: 31.2304, 121.4737
print(f"c_geo: {
c_geo.latitude}, {
c_geo.longitude}") # 输出: c_geo: 23.1291, 113.2644
# 使用 _make() 方法创建实例
data = [22.5431, 114.0579]
d_geo = Geo._make(data)
print(f"d_geo: {
d_geo.latitude}, {
d_geo.longitude}") # 输出: d_geo: 22.5431, 114.0579
# 使用 _asdict() 方法将 namedtuple 转换为字典
a_dict = a_geo._asdict()
print(a_dict) # 输出: OrderedDict([('latitude', 39.9042), ('longitude', 116.4074)])
# 使用 _replace() 方法更新实例
updated_a = a_geo._replace(latitude=39.913818)
print(updated_a) # 输出: Geo(latitude=39.913818, longitude=116.4074)
# 查看字段名称
print(Geo._fields) # 输出: ('latitude', 'longitude')
应用场景
- 数据记录:用于表示数据库查询结果或日志记录。
- 配置项:用于保存配置信息,例如服务器配置或应用程序设置。
- 数据传输:用于定义消息格式,方便序列化和传输数据。
deque
deque
是一个双端队列,它支持从两端进行高效的添加和删除操作。
基本使用
deque 支持从两端进行快速的添加和删除操作。
from collections import deque
# 创建一个空的 deque
my_deque = deque()
# 创建包含元素的 deque
my_deque_with_data = deque([1, 2, 3, 4, 5])
# 添加元素到 deque 的右端
my_deque.append(6)
# 添加元素到 deque 的左端
my_deque.appendleft(0)