Módulo de colecciones de Python: tipos de contenedores avanzados

Aprenda a utilizar el módulo de colecciones de Python. Master Counter, defaultdict, namedtuple, deque y cómo simplificar estructuras de datos complejas.

Pruébelo en el editor

Descripción general

Si bien los contenedores básicos de Python (listas, diccionarios, conjuntos y tuplas) son suficientes para la mayoría de las tareas, los programas complejos a menudo requieren estructuras de datos especializadas. Para solucionar este problema, Python proporciona el módulo integrado "colecciones". Este módulo contiene tipos de datos de contenedor de alto rendimiento diseñados para resolver tareas de programación comunes de manera más eficiente y con una sintaxis más limpia y autodocumentada.

Entre las clases más útiles se encuentra `defaultdict`, que actúa como un diccionario normal pero inicializa automáticamente las claves faltantes con un valor predeterminado (como una lista vacía o un número entero cero), eliminando la necesidad de realizar comprobaciones detalladas de las claves. Otra potencia es la clase "Contador", optimizada específicamente para contar las apariciones de elementos en un iterable. Para colas y pilas rápidas, `deque` (cola de dos extremos) ofrece inserciones y eliminaciones `O(1)` en ambos extremos, a diferencia de las listas que sufren de cambios `O(N)`.

Finalmente, el módulo ofrece `namedtuple`, que crea objetos livianos similares a tuplas a los que se puede acceder usando notación de puntos así como índices tradicionales (por ejemplo, `point.x` en lugar de `point[0]`). Esto le brinda la velocidad y la inmutabilidad de una tupla con la legibilidad de una clase. La incorporación del módulo de colecciones a su flujo de trabajo garantiza que su código siga siendo elegante, eficaz y limpio.

Código y salida de ejecución

Contar palabras usando Counter y organizar grupos de diccionarios con defaultdict.

collections_demo.py
Pruébelo en el editor
from collections import Counter, defaultdict, namedtuple

# 1. Counter: Tallying items
votes = ["yes", "no", "yes", "yes", "no"]
vote_counts = Counter(votes)
print(f"Vote Counts: {vote_counts}")
print(f"Most common: {vote_counts.most_common(1)}")

# 2. defaultdict: Grouping values
grouped_data = defaultdict(list)
grouped_data["engineers"].append("Alice")
grouped_data["engineers"].append("Bob")
print(f"Grouped Data: {dict(grouped_data)}")

# 3. namedtuple: Clean records
Point = namedtuple("Point", ["x", "y"])
p = Point(10, 20)
print(f"Point x: {p.x}, Point y: {p.y}")
Salida terminal
Vote Counts: Counter({'yes': 3, 'no': 2})
Most common: [('yes', 3)]
Grouped Data: {'engineers': ['Alice', 'Bob']}
Point x: 10, Point y: 20

Implementación paso a paso

  • Análisis de archivos de registro para contar las ocurrencias de errores a través del Contador
  • Creación de colas de prioridad o programadores de tareas utilizando deque
  • Representar dimensiones de coordenadas o registros de datos usando nametuple

Preguntas frecuentes

¿Por qué la deque es más rápida que la lista para las operaciones en cola?

Una lista requiere desplazar todos los elementos posteriores en la memoria al insertarlos o eliminarlos desde el principio (O(N)). Una deque se implementa como una lista doblemente enlazada, lo que permite operaciones O(1) en ambos extremos.

¿Puedo cambiar elementos de una tupla con nombre?

No. Dado que las tuplas con nombre heredan de tuplas estándar, son completamente inmutables. Debe utilizar el método ._replace() para devolver una nueva instancia modificada.

Temas relacionados

Recursos recomendados de Python

Amplíe sus conocimientos con tutoriales interactivos relacionados, hojas de trucos y comparaciones de códigos.