Función Python enumerate(), explicada con ejemplos

Este tutorial le enseñará cómo usar la función enumerate() en Python.

La función enumerar () en Python proporciona una sintaxis concisa para acceder a los elementos en un iterable junto con sus índices.

Comenzaremos revisando cómo acceder a elementos e índices usando bucles simples y luego procederemos a aprender la sintaxis de la función enumerate() de Python. También codificaremos ejemplos en el camino.

Vamos a empezar.

Cómo iterar usando for Loop en Python

Cualquier objeto de Python sobre el que pueda iterar y acceder a los elementos individuales, uno a la vez, se denomina iterable. Por lo tanto, las listas, tuplas, diccionarios y cadenas de Python son todos iterables.

Tomemos un ejemplo de una lista de compras definida en la celda de código a continuación.

shopping_list = ["fruits","cookies","cereals","protein bars","post-it notes"]

En Python, puede usar el ciclo for para recorrer cualquier iterable. La sintaxis para hacer esto es la siguiente:

for item in <iterable>:
    # do something on item

# item: looping variable
# <iterable>: any Python iterable: list, tuple, dictionary, string, and so on.

Ahora, usando esta sintaxis, recorramos shopping_list y accedamos a los artículos individuales.

for item in shopping_list:
  print(item)

# Output
fruits
cookies
cereals
protein bars
post-it notes

Esta construcción le ayuda a acceder a los elementos directamente. Sin embargo, es posible que a veces necesite acceder al índice de los elementos, además de los propios elementos.

Puede usar una variable de índice, que puede incrementar dentro del cuerpo del ciclo, como se muestra a continuación:

index = 0
for item in shopping_list:
  print(f"index:{index}, {item}")
  index += 1

# Output
index:0, fruits
index:1, cookies
index:2, cereals
index:3, protein bars
index:4, post-it notes

Pero este no es el método más eficiente. Si no recuerda incrementar el índice, su código no funcionará como se esperaba.

index = 0
for item in shopping_list:
  print(f"index:{index}, {item}")
  # no update of index inside loop body
  # index is never updated and is always 0

# Output
index:0, fruits
index:0, cookies
index:0, cereals
index:0, protein bars
index:0, post-it notes

Otro patrón común de usar el ciclo for es en conjunto con la función range(). Aprenderemos sobre eso en la siguiente sección.

Cómo usar la función range () para acceder al índice

La función len() integrada de Python devuelve la longitud de cualquier objeto de Python. Entonces puede llamar a la función len() con lista_de_compras como argumento para obtener la longitud de la lista_de_compras (que es 5, en este caso).

len(shopping_list)
# Output: 5

La función range() devuelve un objeto de rango que luego puede usar en bucle. Cuando recorres range(stop), obtienes los índices 0, 1, 2,…, stop-1.

Al configurar stop = len(list), puede obtener la lista de índices válidos. Entonces, al usar la función range(), puede acceder al índice y al elemento correspondiente, como se muestra a continuación.

for index in range(len(shopping_list)):
  print(f"index:{index}, item: {shopping_list[index]}")

# Output
index:0, item: fruits
index:1, item: cookies
index:2, item: cereals
index:3, item: protein bars
index:4, item: post-it notes

Sin embargo, esta no es la forma Pythonic recomendada para acceder a índices y elementos simultáneamente.

Sintaxis de la función Python enumerate()

La función enumerate() de Python le permite acceder a los elementos junto con sus índices usando la siguiente sintaxis general:

enumerate(<iterable>, start = 0)

En la sintaxis anterior:

  • es un parámetro obligatorio y puede ser cualquier iterable de Python, como una lista o una tupla.
  • start es un parámetro opcional que controla el índice en el que comienza el conteo. Si no especifica el valor de inicio, el valor predeterminado es cero.

Ahora puede llamar a la función enumerate() con shopping_list y devuelve un objeto enumerate, como se muestra en la celda de código a continuación.

enumerate(shopping_list)
<enumerate at 0x7f91b4240410>

No puede recorrer el objeto de enumeración. Así que vamos a convertir el objeto de enumeración en una lista de Python.

list(enumerate(shopping_list))

# Output
[(0, 'fruits'),
 (1, 'cookies'),
 (2, 'cereals'),
 (3, 'protein bars'),
 (4, 'post-it notes')]

Otro método para acceder a los elementos del objeto enumerate es llamar al función siguiente() con el objeto enumerate como argumento. En Python, la función next() devuelve el siguiente elemento de un iterador.

Internamente, la función next() funciona llamando al método __next__ en el objeto iterador para recuperar los elementos sucesivos.

Asignemos el objeto enumerate a la variable shopping_list_enum.

shopping_list_enum = enumerate(shopping_list)

Cuando llame por primera vez a next() con shopping_list_enum, obtendrá el índice cero y el elemento en el índice 0: la tupla (0, ‘frutas’).

Cuando continúe realizando más llamadas a la función next(), obtendrá los elementos sucesivos junto con sus índices, como se describe a continuación.

next(shopping_list_enum)
# (0, 'fruits')
next(shopping_list_enum)
# (1, 'cookies')
next(shopping_list_enum)
# (2, 'cereals')
next(shopping_list_enum)
# (3, 'protein bars')
next(shopping_list_enum)
# (4, 'post-it notes')

¿Qué sucede si llama a la función next() después de haber accedido a todos los elementos y llegado al final de la lista? Obtiene un error de StopIteration.

next(shopping_list_enum)
# ---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
<ipython-input-16-4220f68f6c7e> in <module>()
----> 1 next(shopping_list_enum)

StopIteration:

La función enumerate() devuelve los índices y elementos sucesivos solo cuando es necesario y no se calculan antes de tiempo. En los proyectos de Python en los que necesita tener en cuenta la eficiencia de la memoria, puede intentar usar la función enumerar () cuando necesite recorrer iterables grandes.

Ejemplos de funciones enumerar () de Python

Ahora que hemos aprendido la sintaxis para usar la función enumerate(), modifiquemos el bucle for que teníamos antes.

De la sección anterior, sabemos que recorrer el objeto enumerate devuelve una tupla con el índice y el elemento. Podemos descomprimir esta tupla en dos variables: índice y elemento.

for index, item in enumerate(shopping_list):
  print(f"index:{index}, item:{item}")

# Output
index:0, item:fruits
index:1, item:cookies
index:2, item:cereals
index:3, item:protein bars
index:4, item:post-it notes

A continuación, veamos cómo especificar un valor de inicio personalizado.

Cómo enumerar () con valor de inicio personalizado

Python sigue la indexación cero, por lo que el valor inicial es 0 de forma predeterminada. Sin embargo, si necesita los índices en un formato legible por humanos, a partir de 1 o cualquier otro índice de su elección, puede especificar un valor de inicio personalizado.

En el ejemplo de la lista de compras, si desea comenzar a contar desde 1, establezca start = 1.

for index, item in enumerate(shopping_list,1):
  print(f"index:{index}, item:{item}")

# Output
index:1, item:fruits
index:2, item:cookies
index:3, item:cereals
index:4, item:protein bars
index:5, item:post-it notes

Sin embargo, al especificar el valor de inicio personalizado, debe asegurarse de especificarlo como el segundo argumento posicional.

Si cambia por error el orden del iterable y el valor inicial, se encontrará con un error, como se explica en la celda de código a continuación.

for index, item in enumerate(1,shopping_list):
  print(f"index:{index}, item:{item}")

# Output
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-12-5dbf7e2749aa> in <module>()
----> 1 for index, item in enumerate(1,shopping_list):
      2   print(f"index:{index}, item:{item}")

TypeError: 'list' object cannot be interpreted as an integer

Para evitar tales errores, puede especificar inicio como argumento de palabra clave, como se muestra a continuación.

for index, item in enumerate(shopping_list, start = 1):
  print(f"index:{index}, item:{item}")

# Output
index:1, item:fruits
index:2, item:cookies
index:3, item:cereals
index:4, item:protein bars
index:5, item:post-it notes

Hasta ahora, ha aprendido a usar la función enumerate() con listas de Python. También puede usar la función de enumeración para recorrer cadenas, diccionarios y tuplas de Python.

Cómo usar la función enumerate () con tuplas de Python

Supongamos que shopping_list es una tupla. En Python, las tuplas también son colecciones, similares a las listas de Python, pero son inmutables. Por lo tanto, no puede modificarlos, y tratar de hacerlo conducirá a un error.

El siguiente fragmento de código inicializa lista_compras como una tupla.

shopping_list = ("fruits","cookies","cereals","protein bars","post-it notes")
type(shopping_list)
# Tuple

Si intenta modificar el primer elemento de la tupla, obtendrá un error ya que una tupla de Python es una colección inmutable.

shopping_list[0] = 'vegetables'

# Output
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-2-ffdafa961600> in <module>()
----> 1 shopping_list[0] = 'vegetables'

TypeError: 'tuple' object does not support item assignment

▶ Ahora, ejecute el siguiente fragmento de código para verificar que la función enumerate() funciona como se esperaba con tuplas.

shopping_list = ("fruits","cookies","cereals","protein bars","post-it notes")
for index, item in enumerate(shopping_list):
    print(f"index:{index}, item:{item}")

Cómo usar la función enumerar () con cadenas de Python

También puede usar la función Python enumerate() para recorrer cadenas y acceder a los caracteres e índices simultáneamente.

Aquí hay un ejemplo.

py_str="Butterfly"
for index, char in enumerate(py_str):
  print(f"index {index}: {char}")

# Output
index 0: B
index 1: u
index 2: t
index 3: t
index 4: e
index 5: r
index 6: f
index 7: l
index 8: y

Del resultado anterior, vemos que los caracteres junto con sus índices (0-8) se han impreso.

Conclusión👩🏽‍💻

Aquí tienes un resumen de lo que has aprendido.

  • Puede usar bucles for para acceder a los elementos y mantener una variable de contador o índice separada.
  • Si lo desea, puede usar la función range() para obtener los índices válidos y acceder a los elementos indexándolos en la lista.
  • Como forma Pythonic recomendada, puede usar la función enumerate() de Python con la sintaxis: enumerate(iterable). De forma predeterminada, el conteo o índice comienza en 0.
  • Puede especificar el valor inicial personalizado con la sintaxis enumerar (iterable, inicio) para que el índice comience en el inicio del valor y los elementos correspondientes.
  • Puede usar la función de enumeración cuando trabaje con tuplas, cadenas, diccionarios y, en general, cualquier iterable de Python.

Espero que haya encontrado útil este tutorial sobre la función enumerate(). A continuación, aprenda cómo encontrar el índice de un elemento en las listas de Python. ¡Sigue codificando!