collections --- 集合与容器类型¶
本模块提供了一些专门的容器数据类型,作为内置 list、tuple、dict 和 set 的补充:双端队列(deque)、带命名字段的元组工厂函数(namedtuple()),以及保持插入顺序的字典(OrderedDict)。
类¶
- class collections.deque(iterable: Iterable, maxlen: int, flags: int = 0)¶
Deque(双端队列)是一种类似列表的容器,支持在队列两端进行 O(1) 复杂度的追加和弹出操作。新的 deque 使用以下参数创建:
iterable 是一个可迭代对象,用于在创建 deque 时填充其内容。它可以是空元组或空列表,以创建一个初始为空的 deque。
必须指定 maxlen,deque 将被限制为该最大长度。一旦 deque 已满,任何新加入的项都会丢弃来自另一端的项。
可选的 flags 可设为 1,以便在添加项时检查溢出。
Deque 对象支持
bool、len()、迭代以及下标读取和存储。它们还具有以下方法:- append(x: Any) None¶
将 x 添加到 deque 的右端。如果启用了溢出检查且队列中已无空间,则引发
IndexError。
- appendleft(x: Any) None¶
将 x 添加到 deque 的左端。如果启用了溢出检查且队列中已无空间,则引发
IndexError。
- pop() Any¶
从 deque 的右端移除并返回一个项。如果不存在任何项,则引发
IndexError。
- popleft() Any¶
从 deque 的左端移除并返回一个项。如果不存在任何项,则引发
IndexError。
- extend(iterable: Iterable) None¶
通过将 iterable 中的所有项追加到 deque 的右端来扩展 deque。如果启用了溢出检查且 deque 中已无空间,则引发
IndexError。
- collections.namedtuple(name: str, fields: str | Sequence[str]) type¶
这是一个工厂函数,用于创建具有特定名称和一组字段的新 namedtuple 类型。namedtuple 是 tuple 的子类,它不仅允许通过数字索引访问其字段,还允许使用符号化的字段名以属性访问的语法进行访问。Fields 是一个指定字段名的字符串序列。为了与 CPython 兼容,它也可以是一个用空格分隔字段名的字符串(但效率较低)。使用示例:
from collections import namedtuple MyTuple = namedtuple("MyTuple", ("id", "name")) t1 = MyTuple(1, "foo") t2 = MyTuple(2, "bar") print(t1.name) assert t2.name == t2[1]
实例还提供以下方法:
- collections._asdict() OrderedDict
以
OrderedDict的形式返回字段名及其值。
- class collections.OrderedDict(*args: Any, **kwargs: Any)¶
dict类型的子类,它会记住并保持所添加键的顺序。接受与dict相同的构造函数形式(一个由(key, value)对组成的可迭代对象、另一个映射,或关键字参数)。当对有序字典进行迭代时,键/项会按照它们被添加的顺序返回:from collections import OrderedDict # To make benefit of ordered keys, OrderedDict should be initialized # from sequence of (key, value) pairs. d = OrderedDict([("z", 1), ("a", 2)]) # More items can be added as usual d["w"] = 5 d["b"] = 3 for k, v in d.items(): print(k, v)
输出:
z 1 a 2 w 5 b 3
- popitem() Tuple¶
从字典中移除并返回一个 (key, value) 对。各对按后进先出(LIFO)顺序返回。
与 CPython 的差异
OrderedDict.popitem()不支持last=False参数,如果存在项,它将始终移除并返回最后一项。对此的一种变通方法是使用
pop(<first_key>)来移除第一项:first_key = next(iter(d)) d.pop(first_key)