collections — types de collections et de conteneurs

Ce module fournit des types de conteneurs spécialisés qui complètent les types intégrés list, tuple, dict et set : une file à double extrémité (deque), une fabrique de tuples à champs nommés (namedtuple()) et un dictionnaire préservant l’ordre (OrderedDict).

Classes

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

Les deques (files à double extrémité) sont un conteneur de type liste qui prend en charge l’ajout et le retrait en O(1) à l’une ou l’autre des extrémités. Les nouvelles deques sont créées à l’aide des arguments suivants :

  • iterable est un itérable utilisé pour remplir la deque lors de sa création. Il peut s’agir d’un tuple ou d’une liste vide pour créer une deque initialement vide.

  • maxlen doit être spécifié et la deque sera limitée à cette longueur maximale. Une fois la deque pleine, tout nouvel élément ajouté éliminera des éléments de l’extrémité opposée.

  • Le paramètre optionnel flags peut valoir 1 pour vérifier le dépassement de capacité lors de l’ajout d’éléments.

Les objets deque prennent en charge bool, len(), l’itération ainsi que la lecture et l’écriture par indice. Ils possèdent également les méthodes suivantes :

append(x: Any) None

Ajoute x à l’extrémité droite de la deque. Lève IndexError si la vérification du dépassement de capacité est activée et qu’il n’y a plus de place dans la file.

appendleft(x: Any) None

Ajoute x à l’extrémité gauche de la deque. Lève IndexError si la vérification du dépassement de capacité est activée et qu’il n’y a plus de place dans la file.

pop() Any

Retire et renvoie un élément de l’extrémité droite de la deque. Lève IndexError si aucun élément n’est présent.

popleft() Any

Retire et renvoie un élément de l’extrémité gauche de la deque. Lève IndexError si aucun élément n’est présent.

extend(iterable: Iterable) None

Étend la deque en ajoutant tous les éléments de iterable à droite de la deque. Lève IndexError si la vérification du dépassement de capacité est activée et qu’il n’y a plus de place dans la deque.

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

Il s’agit d’une fonction fabrique permettant de créer un nouveau type namedtuple avec un nom et un ensemble de champs spécifiques. Un namedtuple est une sous-classe de tuple qui permet d’accéder à ses champs non seulement par indice numérique, mais aussi avec une syntaxe d’accès par attribut utilisant des noms de champs symboliques. Fields est une séquence de chaînes spécifiant les noms de champs. Pour la compatibilité avec CPython, il peut également s’agir d’une chaîne avec des noms de champs séparés par des espaces (mais c’est moins efficace). Exemple d’utilisation

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]

Les instances fournissent également la méthode suivante :

collections._asdict() OrderedDict

Renvoie les noms des champs et leurs valeurs sous forme d’un OrderedDict.

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

Sous-classe du type dict qui mémorise et préserve l’ordre d’ajout des clés. Accepte les mêmes formes de constructeur que dict (un itérable de paires (key, value), un autre mapping, ou des arguments nommés). Lorsqu’un dictionnaire ordonné est parcouru, les clés/éléments sont renvoyés dans l’ordre où ils ont été ajoutés

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)

Sortie

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

Retire et renvoie une paire (clé, valeur) du dictionnaire. Les paires sont renvoyées dans l’ordre LIFO.

Différence avec CPython

OrderedDict.popitem() ne prend pas en charge l’argument last=False et retirera et renverra toujours le dernier élément s’il est présent.

Une solution de contournement consiste à utiliser pop(<first_key>) pour retirer le premier élément

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