Módulo collections
El módulo collections extiende los contenedores integrados con tipos especializados optimizados para patrones comunes: agrupación, conteo, colas de doble extremo y configuración en capas.
Busca en todas las páginas de la documentación
El módulo collections extiende los contenedores integrados con tipos especializados optimizados para patrones comunes: agrupación, conteo, colas de doble extremo y configuración en capas.
from collections import Counter, defaultdict, deque
words = Counter("abracadabra".split())
by_len: defaultdict[int, list[str]] = defaultdict(list)
queue: deque[str] = deque(maxlen=100)Cuándo recurrir a esto:
if key not in dictChainMapfrom collections import ChainMap, Counter, defaultdict, deque
def group_by(items: list[dict], field: str) -> dict[str, list[dict]]:
groups: defaultdict[str, list[dict]] = defaultdict(list)
for item in items:
groups[str(item[field])].append(item)
return dict(groups)
def top_n_words(text: str, n: int) -> list[tuple[str, int]]:
counts = Counter(word.lower() for word in text.split())
return counts.most_common(n)
def sliding_window(values: list[int], size: int) -> list[int]:
window: deque[int] = deque(maxlen=size)
sums: list[int] = []
for v in values:
window.append(v)
if len(window) == size:
sums.append(sum(window))
return sums
def merged_config(*maps: dict[str, object]) -> ChainMap:
return ChainMap(*maps)
if __name__ == "__main__":
rows = [{"role": "dev", "name": "a"}, {"role": "dev", "name": "b"}]
print(group_by(rows, "role"))
print(top_n_words("a b a c a b", 2))
print(sliding_window([1, 2, 3, 4, 5], 3))Lo que esto demuestra:
defaultdict(list) añade sin comprobaciones de existenciaCounter.most_common devuelve pares clasificadosdeque(maxlen=...) elimina automáticamente los elementos más antiguos para ventanas rodantesChainMap busca en la pila de diccionarios la primera clave coincidente__missing__.+, -, &, |.append/pop O(1) en ambos extremos.move_to_end.| Tipo | Uso |
|---|---|
deque | Cola, pila, ventana rodante |
Counter | Recuentos de palabras, histogramas |
defaultdict | Agrupación por, listas de adyacencia |
ChainMap | Capas de configuración con ámbito |
# Counter como multiconjunto
c1 = Counter(a=3, b=1)
c2 = Counter(a=1, c=2)
print(c1 + c2)
# move_to_end en OrderedDict para ordenamiento tipo LRUdefaultdict - La fábrica solo se llama en claves faltantes; aún así, evita trabajo pesado en la fábrica. Solución: Usa list, int, set simples.Counter - Permitidos pero confusos. Solución: Usa subtract conscientemente o filtra los positivos.deque maxlen omisión silenciosa - Los elementos más antiguos desaparecen sin error. Solución: Documenta el comportamiento o comprueba la longitud.ChainMap - Las actualizaciones solo afectan al primer dict. Solución: Copia el resultado fusionado si necesitas un dict plano.OrderedDict para el orden - Los dict normales ya están ordenados. Solución: Usa OrderedDict solo para patrones LRU de move_to_end.| Alternativa | Úsala cuando | No la uses cuando |
|---|---|---|
dict normal | Mapas simples | Boilerplate repetitivo de claves faltantes |
pandas.value_counts | Columnas de DataFrame | Script solo con la biblioteca estándar |
heapq | Ordenamiento por prioridad | Solo cola FIFO |
functools.lru_cache | Memoización de funciones | Conteo de iterables arbitrarios |
Mayormente; los dict regulares conservan el orden de inserción. Conserva OrderedDict para comportamientos LRU de move_to_end.
defaultdict es más limpio para la acumulación. setdefault está bien para claves faltantes ocasionales.
Sí, si son hasheables. A menudo se cuentan cadenas o tuplas extraídas de registros.
append/pop son seguros para hilos en CPython debido al GIL; aún así, coordina operaciones compuestas entre hilos.
ChainMap(os.environ, defaults): el entorno anula los valores predeterminados sin copiar.
Usa un heap para los N principales: eficiente cuando n << claves únicas.
Se ha avanzado hacia typing.NamedTuple y dataclasses; aún disponible como collections.namedtuple.
Expande los recuentos a elementos repetidos; útil para volver a alimentar el multiconjunto en algoritmos.
Nunca uses list.pop(0) en bucles activos (O(n)). Siempre usa deque.popleft().
Convierte primero a dict normal: dict(dd); la fábrica no se conserva en JSON de forma natural.
Versiones de Stack: Esta página fue escrita 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+.
Revisado por Chris St. John·Última actualización: 16 jul 2026