Python enumerate para pares de índice y valor
Python enumerate añade un índice en marcha a un iterable, devolviendo pares (índice, valor) mientras recorres.
Úsalo cuando necesites la posición de cada elemento, como en salidas numeradas o etiquetas.
Es el patrón integrado para emparejar cada elemento con su posición en listas, generadores o líneas de archivos.
Ejemplo De Python Enumerate Para Salida Numerada
Salida:
La salida aparecerá aquí...
Salida:
1. enviar pedido
2. enviar correo al cliente
Cómo Funciona Este Ejemplo
enumerate(tasks, start=1)empareja cada tarea con su posición.start=1hace que los números sean legibles para personas.- La salida muestra cada tarea con su número.
Errores comunes con Python enumerate
Error 1: Olvidar que la numeración empieza en 0.
for line_no, row in enumerate(rows):
print(f"Línea {line_no}: {row['sku']}")
for line_no, row in enumerate(rows, start=1):
print(f"Línea {line_no}: {row['sku']}")
Por qué pasa: enumerate empieza en 0 por defecto, lo cual es correcto para índices pero confuso para números de línea visibles.
Error 2: Enumerar un diccionario y esperar valores.
region_totals = {"oeste": 1200, "este": 980}
for i, total in enumerate(region_totals):
print(i, total)
region_totals = {"oeste": 1200, "este": 980}
for i, (region, total) in enumerate(region_totals.items(), start=1):
print(i, region, total)
Por qué pasa: al iterar un dict se obtienen claves, así que enumerate empareja índices con claves a menos que uses .items().
Si quieres patrones de búsqueda clave/valor, mira el ejemplo de Python dict.
Error 3: Crear list(enumerate(...)) para datos grandes.
indexed_rows = list(enumerate(rows, start=1))
for line_no, row in indexed_rows:
print(line_no, row)
for line_no, row in enumerate(rows, start=1):
print(line_no, row)
Por qué pasa: list() fuerza todos los pares en memoria, mientras que enumerate ya es perezoso y puede procesar en streaming.
enumerate vs range(len()): cuál usar
Usa enumerate cuando… | Usa range(len()) cuando… |
|---|---|
| Necesitas el índice y el elemento juntos. | Solo necesitas índices numéricos. |
| Iteras cualquier iterable, incluidos generadores. | Debes avanzar con pasos personalizados o iterar solo por índice. |
| Quieres bucles legibles sin índices manuales. | Trabajas con índices para slicing o acceso aleatorio. |
Regla general: elige enumerate para índice + valor; usa range(len()) cuando el índice sea lo principal.
Si solo necesitas matemáticas con índices, el ejemplo de Python range profundiza más.
Consideraciones De Rendimiento
enumerate es O(n) y perezoso, así que no asigna una lista extra de pares a menos que lo envuelvas con list(). En la práctica, es más rápido y claro que llamar a list.index() dentro de un bucle (lo que puede hacer el bucle O(n^2)). Si solo necesitas etiquetar filas, enumerate mantiene el uso de memoria constante mientras te da números de línea.
Otros casos de uso de enumerate
Marcar líneas de error al revisar logs.
lines = [
"INFO conectado",
"ERROR tiempo de espera",
"INFO reintento",
]
for line_no, line in enumerate(lines, start=1):
if "ERROR" in line:
print(f"Línea {line_no}: {line}")
Esto mantiene el número de línea exacto unido a cada error, lo que acelera la depuración y la revisión de incidentes.
Funciona igual para archivos porque enumerate acepta cualquier iterable.
Normalizar una lista in situ por índice.
names = [" ada", "grace ", " linus"]
for i, name in enumerate(names):
# actualizar por índice cuando necesites mutar la lista in situ
names[i] = name.strip().title()
print(names)
Esto mantiene los datos en la misma lista mientras te da el índice que necesitas para asignar de vuelta. Es más claro que gestionar un contador manual y mantiene el bucle legible.