collections --- 集合與容器型別

此模組提供特殊的容器資料型別,用以補充內建的 listtupledictset:雙端佇列(deque)、具名欄位的 tuple 工廠(namedtuple()),以及保留順序的 dict(OrderedDict)。

類別

class collections.deque(iterable: Iterable, maxlen: int, flags: int = 0)

Deque(雙端佇列)是一種類似 list 的容器,支援在 deque 任一端進行 O(1) 的附加與彈出操作。新的 deque 使用下列引數建立:

  • iterable 是用於在建立時填入 deque 的可迭代物件。它可以是空的 tuple 或 list,以建立一個初始為空的 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) 配對組成的可迭代物件、另一個對映,或關鍵字引數)。當迭代有序 dict 時,鍵/項目會依照其加入的順序傳回::

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)