Conceptos básicos de estructuras de datos
9 ejemplos para empezar con los contenedores integrados de Python: 6 básicos y 3 intermedios.
Prerrequisitos
- Python 3.14.0 y familiaridad con Conceptos básicos de Python.
Ejemplos básicos
1. Lista - Secuencia mutable ordenada
Añade, indexa y corta secuencias.
items = ["a", "b", "c"]
items.append("d")
first = items[0]
middle = items[1:3]- Añadido O(1) al final; inserción O(n) al principio.
- Las listas son heterogéneas: se permiten todos los tipos de objetos.
- El corte devuelve una nueva lista (copia superficial de referencias).
Relacionado: Listas y tuplas - ordenación y bisect
2. Tupla - Secuencia inmutable fija
Agrupa valores relacionados que no deben cambiar.
point = (10, 20)
x, y = point
record = ("ada", 1842)- Las tuplas son hasheables cuando todos sus elementos lo son.
- Una tupla de un solo elemento necesita una coma al final:
(42,). - El desempaquetado funciona en asignaciones y bucles
for.
Relacionado: Inmutabilidad y Hashabilidad - cuándo las tuplas son claves de diccionario
3. dict - Mapeo Clave-Valor
Búsqueda rápida por clave hasheable.
user = {"id": 1, "name": "Ada"}
user["email"] = "ada@example.com"
for key, value in user.items():
print(key, value)- Promedio O(1) de obtención/asignación/eliminación por clave.
- El orden de inserción se conserva (garantía del lenguaje desde 3.7).
- Las claves deben ser hasheables: no se permiten listas mutables como claves.
Relacionado: Diccionarios - fusión y vistas
4. set - Colección única no ordenada
Pertenencia y álgebra de conjuntos.
tags = {"python", "data", "python"}
tags.add("ml")
assert "data" in tags
common = {"a", "b"} & {"b", "c"} # {"b"}- Los literales usan
{}solo para diccionarios; los conjuntos necesitanset()o{"x"}con valores. - Promedio O(1) en pruebas
in: ideal para comprobaciones de deduplicación. - Unión/intersección/diferencia mediante los operadores
|,&,-.
Relacionado: Sets y Frozensets - frozenset como clave de diccionario
5. Hoja de trucos de Big-O
| Operación | list | dict | set |
|---|---|---|---|
| Índice i | O(1) | - | - |
| Pertenencia | O(n) | O(1)* | O(1)* |
| Añadir | O(1)* | - | - |
| Insertar en medio | O(n) | - | - |
*Caso promedio; las colisiones de hash en el peor de los casos degradan dict/set.
- Elige
set/dictcuando necesites pertenencia rápida. - Elige
listcuando el orden y los duplicados importen con acceso por índice. - Perfila los caminos críticos: las constantes importan para n pequeño.
Relacionado: Elegir la estructura de datos correcta - guía de decisión
6. collections.deque para Colas
Añadido/eliminación rápida desde ambos extremos.
from collections import deque
queue: deque[str] = deque()
queue.append("job-1")
queue.append("job-2")
next_job = queue.popleft()list.pop(0)es O(n);deque.popleft()es O(1).maxlenopcional elimina automáticamente los elementos más antiguos.- No es una cola de prioridad: usa
heapqpara ordenar por prioridad.
Relacionado: Módulo collections - Counter y defaultdict
Ejemplos intermedios
7. defaultdict para Agrupación
Evita comprobaciones manuales de existencia de claves al crear grupos.
from collections import defaultdict
by_role: defaultdict[str, list[str]] = defaultdict(list)
for name, role in [("Ada", "admin"), ("Linus", "dev"), ("Guido", "dev")]:
by_role[role].append(name)- La fábrica se ejecuta solo en claves ausentes.
- Sigue siendo un diccionario: mismos patrones de iteración y serialización.
- Prefiere sobre
setdefaultcuando el valor predeterminado es un objeto mutable nuevo.
Relacionado: Módulo collections - API completa
8. Counter para Frecuencias
Cuenta elementos hasheables en una sola pasada.
from collections import Counter
words = ["a", "b", "a", "c", "a", "b"]
counts = Counter(words)
print(counts.most_common(2)) # [('a', 3), ('b', 2)]- Resta contadores para diferencias de multiconjuntos.
elements()expande los recuentos de nuevo a elementos repetidos.- Ideal para análisis de registros y bocetos de histogramas.
9. Named Tuple para Registros Ligeros
Acceso a campos legible sin una clase completa.
from typing import NamedTuple
class Point(NamedTuple):
x: int
y: int
p = Point(3, 4)
print(p.x, p.y)- Inmutable: seguro como claves de diccionario cuando los campos son hasheables.
dataclasssuele ser mejor cuando necesitas valores predeterminados o métodos.TypedDictse adapta a diccionarios con formato JSON que permanecen como diccionarios en tiempo de ejecución.
Relacionado: TypedDict y NamedTuple - tipado de registros
Versiones de la pila: Esta página se escribió para Python 3.14.0 (estable 3.14, mantenimiento 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+ y uv 0.6+.