El Counter en Python es una clase del módulo collections diseñada para contar elementos hashables. Funciona como un diccionario especializado: cada elemento se convierte en una clave y su frecuencia se guarda como valor. Esto permite analizar palabras, productos, estados, respuestas, eventos y cualquier secuencia repetitiva sin escribir manualmente toda la lógica de conteo.
Counter forma parte de la biblioteca estándar, por lo que no requiere instalación. En esta guía aprenderás a crearlo, consultar frecuencias, encontrar valores comunes, actualizar conteos, combinar resultados y aplicarlo a ejemplos reales.
Crear un Counter
from collections import Counter
colors = ["blue", "red", "blue", "green", "blue", "red"]
counts = Counter(colors)
print(counts)El resultado contiene cada color y la cantidad de apariciones. Counter acepta listas, tuplas, strings, generadores y otros iterables.
La documentación oficial de Counter describe sus métodos, operaciones y comportamientos especiales.
Contar caracteres y palabras
Una string se recorre carácter por carácter:
letters = Counter("programacion")
print(letters)Para contar palabras, primero debes separarlas y normalizarlas:
text = "Python es práctico y Python es legible"
words = text.casefold().split()
word_counts = Counter(words)
print(word_counts)La guía de strings en Python explica casefold(), split(), limpieza y normalización.
Contar palabras con una expresión regular
Cuando el texto contiene puntuación, una expresión regular puede extraer palabras:
import re
from collections import Counter
text = "Python, Python y más Python. Datos y automatización."
words = re.findall(r"\b\w+\b", text.casefold())
counts = Counter(words)
print(counts)La guía de expresiones regulares en Python explica límites de palabra, grupos, cuantificadores y patrones compilados.
Consultar una frecuencia
counts = Counter(["open", "closed", "open"])
print(counts["open"])
print(counts["pending"])A diferencia de un diccionario normal, Counter devuelve cero para una clave ausente en lugar de generar KeyError. Esto facilita la acumulación de resultados.
Encontrar los elementos más comunes
sales = Counter({
"keyboard": 12,
"mouse": 27,
"monitor": 8,
"headset": 15,
})
print(sales.most_common(2))most_common(n) devuelve una lista de tuplas ordenadas desde la frecuencia mayor. Sin argumento devuelve todos los elementos.
Actualizar conteos
counts = Counter(["A", "B", "A"])
counts.update(["A", "C", "C"])
print(counts)update() suma las nuevas frecuencias; no reemplaza el contenido anterior. También acepta un mapeo:
counts.update({"A": 4, "B": 2})Restar frecuencias
inventory = Counter({"pen": 10, "notebook": 5})
inventory.subtract({"pen": 3, "notebook": 1})
print(inventory)subtract() permite valores cero y negativos. Esto es útil para diferencias, pero debes filtrar los resultados cuando solo tengan sentido cantidades positivas.
Eliminar valores cero o negativos
balance = Counter({"A": 3, "B": 0, "C": -2})
positive = +balance
print(positive)El operador unario positivo crea otro Counter conservando únicamente valores mayores que cero. El operador unario negativo conserva la magnitud de los valores negativos.
Convertir a otros tipos
counts = Counter("banana")
print(dict(counts))
print(list(counts))
print(set(counts))Convertir a diccionario conserva las frecuencias. Convertir a lista o set utiliza las claves. La guía de listas, tuplas, sets y diccionarios ayuda a elegir la estructura adecuada.
Recuperar elementos repetidos
counts = Counter({"A": 3, "B": 2, "C": 0})
expanded = list(counts.elements())
print(expanded)elements() repite cada clave según su frecuencia positiva. Ignora cantidades iguales o menores que cero.
Sumar todos los conteos
counts = Counter({"success": 18, "failed": 2, "pending": 5})
print(counts.total())En versiones modernas de Python, total() devuelve la suma de las frecuencias. También puedes utilizar sum(counts.values()).
Combinar Counters
morning = Counter({"coffee": 8, "tea": 3})
afternoon = Counter({"coffee": 5, "juice": 4})
print(morning + afternoon)
print(morning - afternoon)
print(morning | afternoon)
print(morning & afternoon)+suma frecuencias y elimina resultados no positivos.-resta y conserva resultados positivos.|toma el máximo por clave.&toma el mínimo por clave.
Estas operaciones son útiles para inventarios, comparación de colecciones y análisis de frecuencias.
Comprobar si una colección contiene otra
required = Counter({"wood": 3, "stone": 2})
available = Counter({"wood": 8, "stone": 4, "iron": 1})
print(required <= available)La comparación verifica cada frecuencia. Es una forma clara de comprobar si existen recursos suficientes.
Ejemplo práctico: analizar un archivo de texto
import re
from collections import Counter
from pathlib import Path
path = Path("article.txt")
text = path.read_text(encoding="utf-8")
words = re.findall(r"\b\w+\b", text.casefold())
ignored = {"el", "la", "los", "las", "de", "y", "en"}
filtered = [word for word in words if word not in ignored]
counts = Counter(filtered)
for word, frequency in counts.most_common(10):
print(f"{word}: {frequency}")La guía de pathlib en Python explica lectura de archivos, rutas y búsqueda de documentos.
Ejemplo: comparar inventario esperado y real
from collections import Counter
expected = Counter({
"keyboard": 10,
"mouse": 20,
"monitor": 5,
})
actual = Counter({
"keyboard": 8,
"mouse": 22,
"monitor": 5,
})
missing = expected - actual
extra = actual - expected
print("Faltantes:", missing)
print("Excedentes:", extra)Separar faltantes y excedentes produce un informe más útil que una resta única con valores negativos.
Counter frente a defaultdict
Counter es ideal cuando el objetivo principal es contar. defaultdict(int) ofrece más control cuando cada actualización necesita lógica personalizada:
from collections import defaultdict
totals = defaultdict(float)
totals["books"] += 19.90
totals["books"] += 12.50La referencia general del módulo collections documenta Counter, defaultdict, deque y otras estructuras especializadas.
Errores frecuentes
- No normalizar mayúsculas, espacios o puntuación antes de contar.
- Suponer que
update()reemplaza los valores. - Olvidar que
subtract()puede producir números negativos. - Usar objetos no hashables, como listas, como elementos.
- Convertir a lista esperando recuperar las repeticiones; para eso existe
elements(). - Utilizar Counter cuando los valores representan importes decimales y no frecuencias.
Conclusión
Counter reduce el código necesario para contar, comparar y combinar frecuencias. Domina la creación desde iterables, most_common(), update(), subtract(), elements() y las operaciones entre Counters. Después aplícalo a textos, inventarios, registros y análisis de respuestas.






