Son éstas dos funciones especialmente útiles, teniendo ambas relación con la gestión de iteradores:
enumerate
Esta función acepta una estructura iterable como argumento y genera otro iterador formado por tuplas que contienen dos elementos cada una de ellas: un contador que se incrementa de tupla en tupla, y los elementos del iterador original. Veamos un ejemplo (también en este caso tenemos que convertir el resultado de la función en una lista para poder visualizarlo):
Como vemos, cada uno de los elementos de la lista original ("ene", "feb", "mar" y "abr") pasar ahora a ser el segundo elemento del conjunto de tuplas generadas, siendo el primer elemento un contador que comienza por cero y aumenta de forma incremental de tupla en tupla. Esto es especialmente útil cuando necesitamos recorrer un iterable (una lista de elementos, por ejemplo) y necesitamos, por algún motivo, saber qué posición en la lista ocupa cada elemento, o el número de elementos que llevamos procesados.
En todo caso, la función acepta como segundo argumento el valor inicial que queramos dar al contador en cuestión. En el ejemplo de la siguiente imagen estamos inicializando dicho contador con el valor 5:
zip
Esta segunda función acepta como argumento varios iteradores (uno o más) y genera otro iterador de tuplas formadas por elementos de cada uno de los iteradores iniciales. Veamos un ejemplo para hacer esto más claro (convirtiendo el resultado en lista para poder visualizarlo):
Vemos cómo partimos de dos iteradores (dos listas) que, al ser añadidas como argumentos de la función zip, se transforman en un conjunto de tuplas formadas por los elementos de las listas tomados en orden: la primera tupla contiene el primer elemento de cada lista, la segunda el segundo, etc.
En el caso de que los iteradores no tengan la misma longitud (el mismo número de elementos) el resultado de la función zip solo incluirá tantos elementos como tenga el iterador más corto.
Podemos incluir más de dos iteradores como argumento:
Esta función también puede utilizarse para realizar el proceso contrario: partir de una lista de tuplas de n elementos y separarla en varias listas. Por ejemplo, partamos de la siguiente lista de tuplas:
Vemos que las tuplas están formadas por dos elementos. Si quisiéramos extraer dos listas separadas con ellos, podríamos hacerlo con la instrucción zip(*m), que devuelve las listas en cuestión: