Historial de la pregunta
La función enumerate() apareció en Python para facilitar y hacer idiomática la iteración sobre los elementos de una secuencia mientras se obtiene simultáneamente el índice actual. Esto es especialmente importante, ya que antes se recomendaba a menudo crear manualmente un contador separado, lo cual se consideraba menos idiomático y menos legible.
Problema
A menudo se requiere conocer no solo el valor actual, sino también su índice en la secuencia. El control manual de índices mediante una variable separada (i) y la llamada a range(len(seq)) conlleva errores (desajuste de índices y valores, duplicación de código) y disminuye la legibilidad.
Solución
enumerate() devuelve un iterador perezoso que en cada paso devuelve una tupla (índice, valor) del elemento actual. Con ella se puede trabajar elegantemente y de manera confiable con los índices:
colors = ['red', 'green', 'blue'] for idx, color in enumerate(colors): print(idx, color)
La iteración comienza en cero, pero se puede especificar cualquier valor inicial:
for idx, color in enumerate(colors, start=1): print(idx, color)
Características clave:
enumerate() trabaja con cualquier secuencia iterable, devuelve la tupla (índice, elemento)start, lo cual es conveniente en determinadas situaciones¿Se puede desactivar la devolución del índice y dejar solo los valores al trabajar con enumerate()?
No, enumerate() siempre devuelve pares (índice, valor). Si solo se necesita el valor, usa un ciclo for normal:
for value in my_list: print(value)
¿Se puede usar enumerate() con objetos no indexables, como generadores?
Sí, enumerate() funciona con cualquier objeto iterable, incluidos generadores. La indexación se realizará en el orden en que aparecen los valores:
def mygen(): for i in range(3): yield chr(ord('a')+i) for idx, val in enumerate(mygen()): print(idx, val) # 0 a, 1 b, 2 c
¿Se puede establecer automáticamente un índice inicial diferente de 0, y qué sucede con valores negativos?
Sí, enumerate() tiene el argumento start. Si se pasa un valor negativo, la indexación comenzará desde ese valor:
for idx, x in enumerate(['a', 'b', 'c'], start=-3): print(idx, x) # -3 a, -2 b, -1 c
range(len(seq)) en lugar de enumerate() para iterar sobre una lista — hace que el código sea menos idiomático.En el equipo mantienen un gran código, a menudo usan:
for i in range(len(mylist)): process(i, mylist[i])
Ventajas:
Desventajas:
Después de refactorizar, pasan a:
for idx, val in enumerate(mylist): process(idx, val)
Ventajas:
Desventajas: