Si siempre pones una variable de contador en cada bucle for cuando necesitas hacerle seguimiento a las iteraciones, te contamos que Python te facilita este trabajo con la función enumerate().
Esta función hace que el programa sea más fácil de leer, más eficiente y más fácil de mantener. En este artículo te mostraremos qué es enumerate(), cómo funciona y cómo se usa, y te daremos algunos ejemplos para ilustrar su aplicación.
Para qué sirve la función enumerate() en Python
Esta función convierte un objeto de recopilación de datos en un objeto de enumeración. Retorna un objeto con un contador que sirve de clave para cada valor, lo que facilita el acceso a cada elemento del grupo de datos.
Es muy útil usar bucles con varios objetos, pero con frecuencia necesitamos tener un medio para hacerle seguimiento a dichos bucles y también a los elementos a los que accedemos con cada iteración. La función enumerate satisface esta necesidad asignando un contador a cada elemento de un objeto, lo que nos permite rastrearlos.
Esto también facilita la manipulación de los grupos de datos cuando esto es posible. No todos los objetos de recopilación de datos de Python se pueden cambiar, y los conjuntos son un buen ejemplo de eso.
Cómo funciona enumerate() en Python
Enumerate() funciona muy parecido a un bucle for, ya que se repite una sola vez por cada elemento en un grupo de datos. La principal diferencia entre los dos es que la función enumerate también modifica automáticamente los datos que llegan, convirtiendo cada elemento en un par clave-valor. A medida que la función itera en todo el objeto, a cada elemento se le asigna un número que corresponde a la cantidad de veces que se ha repetido el bucle, incluida la actual.
Enumerate() acepta dos parámetros: el objeto iterable, que es obligatorio, y el número de inicio opcional. El parámetro del número de inicio acepta un entero y determina con qué número se debe empezar el conteo. Como este parámetro es opcional, el número de inicio por defecto siempre es el cero, al igual que en la indexación de matrices.
A continuación veremos algunos ejemplos, en donde además podremos analizar los datos de salida para saber cómo cambiaron los de entrada.
Cómo se usa la función enumerate() en Python
En Python, hay cuatro tipo de datos, también denominados colecciones, para almacenar la información; sin embargo, para los propósitos de este artículo solo nos referiremos a dos.
Las colecciones llamadas tuplas y listas se constituyen de objetos organizados que la mayoría de las veces no necesitarán de la función enumerate, excepto en casos de programación compleja, como el aprendizaje automático. Por otra parte, los conjuntos (o sets) y los diccionarios son tipos de colecciones que no están ordenadas, por lo que con frecuencia, requerirán alguna función de enumeración.
La función enumerate de Python permite acceder y contar elementos de manera más sencilla en una colección de datos.
Después de haber definido las colecciones en Python, podemos pasar a ver ejemplos de cómo se aplica la función en dos colecciones muy distintas, la tupla y el conjunto. Estas serían las características más importantes de ambas que influyen en el comportamiento de la función:
- Tupla: se compone de objetos ordenados e inmutables. Permite tener elementos duplicados.
- Conjunto: se compone de objetos sin ordenar, inmutables (se pueden agregar o eliminar elementos, pero no se pueden modificar) y sin indizar. No permite tener elementos duplicados.
La función enumerate() y los conjuntos
Como decíamos anteriormente, los conjuntos son colecciones sin orden, cuyos elementos son inmutables, por lo que no se pueden modificar después de haberlos agregado. La naturaleza de este tipo de colecciones implica que el orden de los elementos no es consistente y no se pueden acceder usando un valor de indexación porque no lo contienen.
La función enumerate permite asociar un contador como clave a cada elemento del conjunto, lo que facilita su estructuración. Al enumerar el conjunto, podemos controlar mejor y de manera más confiable la forma como interactuamos con sus elementos. Como no tienen una ubicación indizada y designada, la función resulta muy útil en estos casos.
Las líneas de código que presentamos arriba arrojarían un mensaje de error indicando que no es posible incluir un subíndice en el conjunto, pues al no tener índices, no es compatible con la colección. Sin embargo, si enumeramos el conjunto, podremos usar el contador como índice para encontrar el elemento que necesitamos.
Ahora, el código mostrado arriba se imprimirá con el resultado que presentamos a continuación, aunque el orden en el que se retornan los elementos puede variar, debido a que los conjuntos no son grupos ordenados.
Es importante tener en cuenta que esto no altera el valor del conjunto, ya que al imprimirlo obtendremos el mismo que declaramos, aunque en un orden distinto.
Para conservar el efecto de la función enumerate en un conjunto, será necesario convertir los resultados en un tipo de datos distinto. Aquí vemos un ejemplo de cómo hacerlo usando la función list constructor().
Para empezar, hay que crear el conjunto, luego, aplicamos la función enumerate para este conjunto y guardamos el resultado con una variable nueva. Finalmente, se utiliza el resultado de la función enumerate() con la función list constructor() y se guarda como un nuevo objeto de lista. Los datos en este nuevo objeto aparecerán como una lista de pares clave-valor.
El único problema con esto es que la estructura de datos obtenida es compleja, y como no se puede predecir, es necesario tener cuidado al usarla. Ahora, veamos un ejemplo de cómo utilizar la función enumerate en las tuplas.
La función enumerate() y las tuplas
En las tuplas también se pueden obtener pares clave-valor al usar la función enumerate, y en este caso, es más confiable con respecto al orden en que se retornan los elementos. Esto sucede porque los elementos en una tupla se mantienen en la posición en la que se agregaron, lo que las hace colecciones ordenadas. Por ejemplo, podemos acceder al segundo elemento en una tupla usando una notación entre corchetes con el índice 1.
Por esta razón, enumerar las tuplas en Python es más sencillo que enumerar conjuntos, ya que los resultados son más predecibles y consistentes. A continuación presentamos un ejemplo de cómo podemos usar la función.
El resultado se imprimirá por cada iteración del bucle mostrando los pares clave-valor que creamos.
Es importante tener en cuenta que este ejemplo es un poco redundante, ya que las tuplas son colecciones ordenadas y se puede acceder a los elementos mediante índices. Sin embargo, eso no quiere decir que no es viable usar la función; un buen ejemplo es la enumeración de un diccionario de conjuntos. Los conjuntos en un diccionario se podrían enumerar para poder analizar mejor su contenido.
Aplicar la función enumerate() de Python
Hay muchísimos trucos como la función enumerate que se pueden aplicar durante la programación, y de la complejidad del código dependerá la frecuencia con la que necesitarás usar este tipo de recursos. Eso también aumentará la dificultad en su aplicación, pero el uso de este tipo de funciones permite restructurar con eficacia grandes cantidades de datos para muchos propósitos.
Te deseamos mucha suerte, y te recomendamos que uses recursos como Stack Overflow en español o la documentación de Python para aprender más sobre su funcionamiento.