collections --- コレクション型とコンテナ型

このモジュールは、組み込みの listtupledictset を補完する特殊なコンテナデータ型を提供します。両端キュー(deque)、名前付きフィールドを持つタプルのファクトリ(namedtuple())、そして順序を保持する dict(OrderedDict)です。

クラス

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

Deque(両端キュー)はリストに似たコンテナで、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) ペアのイテラブル、別のマッピング、またはキーワード引数)を受け付けます。順序付き 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)