collections — kolekce a kontejnerové typy

Tento modul poskytuje specializované kontejnerové datové typy, které doplňují vestavěné typy list, tuple, dict a set: oboustrannou frontu (deque), továrnu na n-tice s pojmenovanými poli (namedtuple()) a slovník zachovávající pořadí (OrderedDict).

Třídy

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

Deque (oboustranné fronty) jsou kontejner podobný seznamu, který podporuje přidávání a odebírání prvků z obou konců fronty v čase O(1). Nové fronty deque se vytvářejí pomocí následujících argumentů:

  • iterable je iterovatelný objekt sloužící k naplnění fronty deque při jejím vytvoření. Může to být prázdná n-tice nebo seznam, čímž vznikne zpočátku prázdná fronta deque.

  • maxlen musí být zadán a fronta deque bude omezena na tuto maximální délku. Jakmile je fronta deque plná, jakékoli nově přidané prvky vyřadí prvky z opačného konce.

  • Volitelný argument flags může být 1, aby se při přidávání prvků kontrolovalo přetečení.

Objekty deque podporují bool, len(), iteraci a čtení i zápis přes indexování. Mají také následující metody:

append(x: Any) None

Přidá x na pravý konec fronty deque. Vyvolá IndexError, pokud je zapnuta kontrola přetečení a ve frontě již není místo.

appendleft(x: Any) None

Přidá x na levý konec fronty deque. Vyvolá IndexError, pokud je zapnuta kontrola přetečení a ve frontě již není místo.

pop() Any

Odebere a vrátí prvek z pravého konce fronty deque. Vyvolá IndexError, pokud nejsou přítomny žádné prvky.

popleft() Any

Odebere a vrátí prvek z levého konce fronty deque. Vyvolá IndexError, pokud nejsou přítomny žádné prvky.

extend(iterable: Iterable) None

Rozšíří frontu deque přidáním všech prvků z iterable na pravý konec fronty deque. Vyvolá IndexError, pokud je zapnuta kontrola přetečení a ve frontě deque již není místo.

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

Toto je továrna na vytvoření nového typu namedtuple s konkrétním názvem a sadou polí. Namedtuple je podtřída typu tuple, která umožňuje přistupovat k jeho polím nejen pomocí číselného indexu, ale také pomocí syntaxe přístupu k atributům s použitím symbolických názvů polí. Fields je posloupnost řetězců určujících názvy polí. Z důvodu kompatibility s CPythonem to může být také řetězec s názvy polí oddělenými mezerami (to je však méně efektivní). Příklad použití:

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]

Instance také poskytují následující metodu:

collections._asdict() OrderedDict

Vrátí názvy polí a jejich hodnoty jako OrderedDict.

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

Podtřída typu dict, která si pamatuje a zachovává pořadí přidávaných klíčů. Přijímá stejné formy konstruktoru jako dict (iterovatelný objekt dvojic (key, value), jiné mapování nebo klíčové argumenty). Při iteraci přes uspořádaný slovník se klíče/položky vracejí v pořadí, v jakém byly přidány:

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)

Výstup:

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

Odebere a vrátí dvojici (klíč, hodnota) ze slovníku. Dvojice se vracejí v pořadí LIFO.

Rozdíl oproti CPythonu

OrderedDict.popitem() nepodporuje argument last=False a vždy odebere a vrátí poslední položku, pokud je přítomna.

Řešením je použít pop(<first_key>) k odebrání první položky:

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