collections --- 集合与容器类型

本模块提供了一些专门的容器数据类型,作为内置 listtupledictset 的补充:双端队列(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 对象支持 boollen()、迭代以及下标读取和存储。它们还具有以下方法:

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)