collections — tipos de colecciones y contenedores

Este módulo proporciona tipos de datos de contenedor especializados que complementan los tipos integrados list, tuple, dict y set: una cola de doble extremo (deque), una fábrica de tuplas con campos nombrados (namedtuple()) y un diccionario que preserva el orden (OrderedDict).

Clases

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

Las deques (colas de doble extremo) son un contenedor similar a una lista que admite operaciones de añadir y extraer en O(1) desde cualquier extremo de la deque. Las nuevas deques se crean usando los siguientes argumentos:

  • iterable es un iterable usado para poblar la deque cuando se crea. Puede ser una tupla o lista vacía para crear una deque que inicialmente esté vacía.

  • maxlen debe especificarse y la deque quedará limitada a esta longitud máxima. Una vez que la deque esté llena, cualquier elemento nuevo añadido descartará elementos del extremo opuesto.

  • El parámetro opcional flags puede ser 1 para comprobar el desbordamiento al añadir elementos.

Los objetos deque admiten bool, len(), iteración y carga y almacenamiento por subíndice. También tienen los siguientes métodos:

append(x: Any) None

Añade x al lado derecho de la deque. Lanza IndexError si la comprobación de desbordamiento está habilitada y no hay más espacio en la cola.

appendleft(x: Any) None

Añade x al lado izquierdo de la deque. Lanza IndexError si la comprobación de desbordamiento está habilitada y no hay más espacio en la cola.

pop() Any

Elimina y devuelve un elemento del lado derecho de la deque. Lanza IndexError si no hay elementos presentes.

popleft() Any

Elimina y devuelve un elemento del lado izquierdo de la deque. Lanza IndexError si no hay elementos presentes.

extend(iterable: Iterable) None

Extiende la deque añadiendo todos los elementos de iterable al lado derecho de la deque. Lanza IndexError si la comprobación de desbordamiento está habilitada y no hay más espacio en la deque.

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

Esta es una función de fábrica para crear un nuevo tipo namedtuple con un nombre específico y un conjunto de campos. Una namedtuple es una subclase de tuple que permite acceder a sus campos no solo por índice numérico, sino también con una sintaxis de acceso por atributo usando nombres de campo simbólicos. Fields es una secuencia de cadenas que especifican los nombres de los campos. Por compatibilidad con CPython también puede ser una cadena con nombres de campo separados por espacios (pero esto es menos eficiente). Ejemplo de uso:

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]

Las instancias también proporcionan el siguiente método:

collections._asdict() OrderedDict

Devuelve los nombres de los campos y sus valores como un OrderedDict.

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

Subclase del tipo dict que recuerda y preserva el orden de las claves añadidas. Acepta las mismas formas de constructor que dict (un iterable de pares (key, value), otro mapeo o argumentos de palabra clave). Cuando se itera sobre un diccionario ordenado, las claves/elementos se devuelven en el orden en que se añadieron:

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)

Salida:

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

Elimina y devuelve un par (clave, valor) del diccionario. Los pares se devuelven en orden LIFO.

Diferencia con CPython

OrderedDict.popitem() no admite el argumento last=False y siempre eliminará y devolverá el último elemento si está presente.

Una solución alternativa para esto es usar pop(<first_key>) para eliminar el primer elemento:

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