参考文档:collections --- 容器数据类型 — Python 3.10.1 文档
简介
这个模块实现了特定目标的容器,提供了python标准内建容器dict, list, set和tuple的替代选择
namedtuple() | 创建命名元组子类的工厂函数 |
deque | 类似列表(list)的容器,实现了在两端快速的添加(append)和弹出(pop) |
ChainMap | 类似字典(dict)的容器类,将多个映射集合到一个视图里面 |
Counter | 字典的子类,提供了可哈希对象的计数功能 |
OrderedDict | 字典的子类,保存了他们被添加的顺序 |
defaultdict | 字典的子类,提供了一个工厂函数,为字典查询提供了一个默认值 |
UserDict | 封装了字典对象,简化了字典子类化 |
UserList | 封装了列表对象,简化了列表子类化 |
UserString | 封装了字符串对象,简化了字符串子类化 |
1. namedtuple() 命名元组的工厂函数
使用示例:
>>> Point = namedtuple('Point', ['x', 'y'])
>>> p = Point(11, y=22) # 用位置参数或者关键字参数实例化
>>> p[0] + p[1] # 索引取值
33
>>> x,y = p # 解包
>>> x,y
(11, 22)
>>> p.x+p.y # 字段名获取值
33
>>> p # __repr__
Point(x=11, y=22)
collecitons.namedtuple(typename, field_name, *, rename=False, defaults=None, module=None)
返回一个新的元组子类,名为typaname
field_name: 字段名,可以是一个像['x', 'y']一样的字符串序列,也可以是一个纯字符串,用空白或者逗号分隔开元素名,比如‘x y’ 或者‘x, y’
rename:如果为真,无效字段名会自动传换成位置名。比如['abc', 'def', 'abc']转换成[
'abc', '_1', '_2']
defaults: 可以为None,或者是一个默认值的iterable。作为字段默认值出现,如果defaults为iterable,且长度小于字field_name的长度,那么defaults就应用到最右边的参数。比如field_name为['x', 'y', 'z'],default为(1,2),那么x就必须指定一个参数值,y默认值为1,z默认值2.
module: 如果module值有定义,命名元组的__module__属性值就被设置
EmployeeRecord = namedtuple('EmployeeRecord', 'name, age, title, department, paygrade')
import csv
for emp in map(EmployeeRecord._make, csv.reader(open("employees.csv", "rb"))):
print(emp.name, emp.title)
import sqlite3
conn = sqlite3.connect('/companydata')
cursor = conn.cursor()
cursor.execute('SELECT name, age, title, department, paygrade FROM employees')
for emp in map(EmployeeRecord._make, cursor.fetchall()):
print(emp.name, emp.title)
namedtuple支持的三个方法和两个属性
somenamedtuple._make(iterable)
# 从存在的序列或迭代实例创建一个新实例
somenamedtuple._asdict()
# 返回一个新dict,将值映射到字段名
somenamedtuple._replace(**kwargs)
# 返回一个新的命名元组实例,并将指定域替换为新的值
somenamedtuple._fields
# 列出字段名
somenamedtuple._field_defaults
# 将字段名映射到默认值
方法和属性使用示例:
>>> t = [11, 22]
>>> Point._make(t) # _make(iterable)
Point(x=11, y=22)
>>> p = Point(x=11, y=22)
>>> p._asdict() # _asdict()
{'x':11, 'y':22}
>>> p._replace(x=33) # _replace(**kwargs)
Point(x=33, y=22)
>>> for partnum, record in inventory.item():
inventory[partnum] = record._replace(price=newprices[partnum], timestamp=time.now())
>>>p._fields # _fields
('x', 'y')
>>> Color = namedtuple('Color', ['red', 'green', 'blue'])
>>> Pixel = namedtuple('Pixel', Point._fields + Color._fields)
>>> Pixel(11, 22, 128, 255, 0)
Pixel(x=11, y=22m red=128, green=255, blue=0)
>>> Account = namedtuple('Account