collections — Sammlungs- und Containertypen

Dieses Modul stellt spezialisierte Container-Datentypen bereit, die die eingebauten Typen list, tuple, dict und set ergänzen: eine doppelseitige Warteschlange (deque), eine Factory für Tupel mit benannten Feldern (namedtuple()) und ein die Reihenfolge bewahrendes Dictionary (OrderedDict).

Klassen

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

Deques (doppelseitige Warteschlangen) sind ein listenartiger Container, der das Anhängen und Entfernen von Elementen an beiden Enden der Deque in O(1) unterstützt. Neue Deques werden mit den folgenden Argumenten erstellt:

  • iterable ist ein Iterable, das zum Befüllen der Deque bei ihrer Erstellung verwendet wird. Es kann ein leeres Tupel oder eine leere Liste sein, um eine zunächst leere Deque zu erstellen.

  • maxlen muss angegeben werden, und die Deque wird auf diese maximale Länge begrenzt. Sobald die Deque voll ist, verwerfen neu hinzugefügte Elemente jeweils Elemente vom gegenüberliegenden Ende.

  • Das optionale flags kann den Wert 1 haben, um beim Hinzufügen von Elementen auf Überlauf zu prüfen.

Deque-Objekte unterstützen bool, len(), Iteration sowie das Laden und Speichern per Indexzugriff. Sie verfügen außerdem über die folgenden Methoden:

append(x: Any) None

Fügt x auf der rechten Seite der Deque hinzu. Löst IndexError aus, wenn die Überlaufprüfung aktiviert ist und kein Platz mehr in der Warteschlange vorhanden ist.

appendleft(x: Any) None

Fügt x auf der linken Seite der Deque hinzu. Löst IndexError aus, wenn die Überlaufprüfung aktiviert ist und kein Platz mehr in der Warteschlange vorhanden ist.

pop() Any

Entfernt ein Element von der rechten Seite der Deque und gibt es zurück. Löst IndexError aus, wenn keine Elemente vorhanden sind.

popleft() Any

Entfernt ein Element von der linken Seite der Deque und gibt es zurück. Löst IndexError aus, wenn keine Elemente vorhanden sind.

extend(iterable: Iterable) None

Erweitert die Deque, indem alle Elemente aus iterable rechts an die Deque angehängt werden. Löst IndexError aus, wenn die Überlaufprüfung aktiviert ist und kein Platz mehr in der Deque vorhanden ist.

collections.namedtuple(name: str, fields: str | Sequence[str]) type

Dies ist eine Factory-Funktion zum Erstellen eines neuen namedtuple-Typs mit einem bestimmten Namen und einer Reihe von Feldern. Ein namedtuple ist eine Unterklasse von tuple, die den Zugriff auf seine Felder nicht nur über einen numerischen Index, sondern auch über eine Attributzugriffssyntax mit symbolischen Feldnamen ermöglicht. Fields ist eine Folge von Strings, die die Feldnamen angeben. Aus Kompatibilitätsgründen mit CPython kann es auch ein String mit durch Leerzeichen getrennten Feldnamen sein (dies ist jedoch weniger effizient). Anwendungsbeispiel:

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]

Instanzen stellen außerdem die folgende Methode bereit:

collections._asdict() OrderedDict

Gibt die Feldnamen und ihre Werte als OrderedDict zurück.

class collections.OrderedDict(*args: Any, **kwargs: Any)

Unterklasse des Typs dict, die sich die Reihenfolge der hinzugefügten Schlüssel merkt und bewahrt. Akzeptiert dieselben Konstruktorformen wie dict (ein Iterable von (key, value)-Paaren, ein anderes Mapping oder Schlüsselwortargumente). Beim Iterieren über ein OrderedDict werden Schlüssel/Elemente in der Reihenfolge zurückgegeben, in der sie hinzugefügt wurden:

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)

Ausgabe:

z 1
a 2
w 5
b 3
popitem() Tuple

Entfernt ein (key, value)-Paar aus dem Dictionary und gibt es zurück. Paare werden in LIFO-Reihenfolge zurückgegeben.

Unterschied zu CPython

OrderedDict.popitem() unterstützt das Argument last=False nicht und entfernt stets das letzte Element und gibt es zurück, sofern vorhanden.

Ein Workaround hierfür besteht darin, pop(<first_key>) zu verwenden, um das erste Element zu entfernen:

first_key = next(iter(d))
d.pop(first_key)