collections — typy kolekcji i kontenerów

Ten moduł udostępnia wyspecjalizowane typy danych będące kontenerami, które uzupełniają wbudowane typy list, tuple, dict oraz set: dwustronną kolejkę (deque), fabrykę krotek z nazwanymi polami (namedtuple()) oraz słownik zachowujący kolejność (OrderedDict).

Klasy

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

Kolejki dwustronne (deque) są kontenerem podobnym do listy, który obsługuje dodawanie i usuwanie elementów z dowolnej strony w czasie O(1). Nowe kolejki deque tworzy się przy użyciu następujących argumentów:

  • iterable to obiekt iterowalny używany do wypełnienia kolejki deque podczas jej tworzenia. Może to być pusta krotka lub lista, aby utworzyć początkowo pustą kolejkę deque.

  • maxlen musi zostać podany, a kolejka deque będzie ograniczona do tej maksymalnej długości. Gdy kolejka deque jest pełna, każdy nowo dodany element spowoduje usunięcie elementów z przeciwnego końca.

  • Opcjonalny argument flags może wynosić 1, aby sprawdzać przepełnienie podczas dodawania elementów.

Obiekty deque obsługują bool, len(), iterację oraz odczyt i zapis przez indeksowanie. Posiadają również następujące metody:

append(x: Any) None

Dodaje x po prawej stronie kolejki deque. Zgłasza IndexError, jeśli sprawdzanie przepełnienia jest włączone i w kolejce nie ma już miejsca.

appendleft(x: Any) None

Dodaje x po lewej stronie kolejki deque. Zgłasza IndexError, jeśli sprawdzanie przepełnienia jest włączone i w kolejce nie ma już miejsca.

pop() Any

Usuwa i zwraca element z prawej strony kolejki deque. Zgłasza IndexError, jeśli nie ma żadnych elementów.

popleft() Any

Usuwa i zwraca element z lewej strony kolejki deque. Zgłasza IndexError, jeśli nie ma żadnych elementów.

extend(iterable: Iterable) None

Rozszerza kolejkę deque, dołączając wszystkie elementy z iterable po jej prawej stronie. Zgłasza IndexError, jeśli sprawdzanie przepełnienia jest włączone i w kolejce deque nie ma już miejsca.

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

Jest to funkcja fabryczna tworząca nowy typ namedtuple o określonej nazwie i zestawie pól. Namedtuple jest podklasą tuple, która pozwala uzyskać dostęp do swoich pól nie tylko za pomocą indeksu liczbowego, ale również za pomocą składni dostępu do atrybutów przy użyciu symbolicznych nazw pól. Fields to sekwencja łańcuchów znaków określających nazwy pól. Dla zgodności z CPythonem może to być również łańcuch znaków z nazwami pól rozdzielonymi spacjami (ale jest to mniej wydajne). Przykład użycia:

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]

Instancje udostępniają również następującą metodę:

collections._asdict() OrderedDict

Zwraca nazwy pól i ich wartości jako OrderedDict.

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

Podklasa typu dict, która zapamiętuje i zachowuje kolejność dodawania kluczy. Akceptuje te same formy konstruktora co dict (obiekt iterowalny par (key, value), inne mapowanie lub argumenty nazwane). Podczas iteracji po słowniku uporządkowanym klucze/elementy są zwracane w kolejności ich dodania:

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)

Wynik:

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

Usuwa i zwraca parę (klucz, wartość) ze słownika. Pary są zwracane w kolejności LIFO.

Różnica względem CPythona

OrderedDict.popitem() nie obsługuje argumentu last=False i zawsze usunie oraz zwróci ostatni element, jeśli istnieje.

Obejściem tego jest użycie pop(<first_key>) w celu usunięcia pierwszego elementu:

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