Explorando la función zip() de Python Simplificando la iteración y la combinación de datos

Explorando zip() en Python para simplificar la iteración y combinación de datos

Una guía para principiantes para optimizar la manipulación de datos y la iteración con zip() en Python para mejorar la eficiencia y productividad

Foto de Tomas Sobek en Unsplash

Introducción

Zip es una función incorporada en el intérprete estándar de Python. Es un método poderoso que facilita el trabajo con iterables como diccionarios y listas.

En este artículo, exploraremos la sintaxis y el funcionamiento de la función zip, a medida que adquirimos una comprensión práctica de cómo utilizar el método en circunstancias reales.

Sintaxis

La definición general de la función según la documentación de Python:

zip(*iterables, strict=False)

Dada la definición, es evidente que el método toma un número arbitrario de iterables utilizando el argumento no clave *iterables. Por lo tanto, podemos pasar cualquier número de iterables a la función zip, que se pasará como una única lista de argumentos.

Hay un argumento de palabra clave ‘strict’ que exploraremos más adelante.

Ejemplo de caso de uso 1

Para entender cómo utilizar la función zip, revisa este fragmento de código interactivo.

Ejemplo 1 — Replit

Consideremos que tenemos 3 listas diferentes. Una contiene los productos, y las otras dos listas contienen la cantidad de productos vendidos y su precio.

Si queremos calcular las ventas totales para cada producto, podemos hacerlo utilizando un simple bucle for. Sin embargo, tendríamos que indexar cada matriz y lidiar con casos especiales en caso de una falta de coincidencia de tamaño. Además, la solución no es escalable para un número arbitrario de iterables.

La función zip proporciona una interfaz simple para realizar tareas como esta, ya que se pueden pasar todos los iterables a la función zip.

Esto devuelve un iterador de tuplas, donde la tupla i-ésima contiene el i-ésimo elemento de cada uno de los iterables de argumento.

Por lo tanto, al iterar sobre las listas combinadas en el ejemplo anterior, cada producto se combinará con su precio y cantidad dentro de una sola tupla. Esto se puede desestructurar para obtener valores durante la iteración.

Ejecuta el código anterior para comprender mejor el funcionamiento de la función zip.

Ejemplo de caso de uso 2

Este es un ejemplo más complicado. Supongamos que tenemos una matriz bidimensional y queremos calcular el promedio de todos los valores en la columna.

Utilizando un bucle for, podemos iterar sobre las filas de una matriz. Para el promedio de las columnas, tendremos que utilizar bucles anidados para iterar sobre las columnas por separado.

Zip proporciona una solución alternativa.

transposed = zip(*matrix)

Podemos transponer una matriz simplemente pasando todas las filas como iterables a la función zip. El operador * se utiliza para desempaquetar argumentos, por lo que desempaqueta la matriz para transponerla.

column_averages = [sum(column) / len(column) for column in transposed]

Luego podemos iterar sobre cada columna de la iteración zip, para calcular el promedio de las columnas.

Cómo descomprimir iterables

Ahora que entendemos tanto la función zip como el operador *, podemos combinar ambos para revertir la función zip.

Una vez que hemos combinado algunos iterables con zip, podemos recuperarlos desempaquetando todas las tuplas zip y luego combinándolas nuevamente con zip.

Veámoslo paso a paso:

products = ['Manzana', 'Plátano', 'Cereza']prices = [1.5, 0.75, 2.25]quantities = [10, 15, 5]# Usando zip() para combinar las listassales = zip(products, prices, quantities)

Primero expandimos los iterables, lo que crea nuevos iterables que son similares al ejemplo de la matriz transpuesta anterior.

print(*sales)# Salida# ('Manzana', 1.5, 10) ('Plátano', 0.75, 15) ('Cereza', 2.25, 5)

Ahora podemos combinarlos, de modo que todos los elementos en la primera posición sean miembros del primer iterable, todos los elementos en la segunda posición sean miembros del segundo iterable, y así sucesivamente.

Es importante destacar que una vez que se itera sobre un objeto zip, este se agota, lo que significa que el objeto zip se vacía.

Así, podemos hacerlo en una sola línea de forma abreviada:

productos, precios, cantidades = zip(*ventas)

Argumento de Palabra Clave Estricto

La función zip permite iterables de diferentes tamaños de forma predeterminada. Si los iterables pasados son de diferentes tamaños, solo se combinan los elementos hasta el iterable más corto.

list(zip(range(3), ['fee', 'fi', 'fo', 'fum']))# Salida [(0, 'fee'), (1, 'fi'), (2, 'fo')]

Sin embargo, en su mayoría la función zip se utiliza para iterables del mismo tamaño. Para asegurar esta restricción, podemos pasar strict=True. Esto generará un ValueError si hay una coincidencia de tamaño entre los argumentos iterables.

Beneficios de Usar Zip

Eficiente en Memoria

Zip es perezoso. Los iterables se generan sobre la marcha durante la iteración. Por lo tanto, no se necesita una nueva lista para almacenar los iterables combinados.

Flexibilidad

Zip funciona con una amplia gama de iterables, como listas, diccionarios, tuplas y cadenas. Incluso puede funcionar con clases definidas por el usuario. Lo único que debes hacer es implementar el método especial __iter__ en Python. Un ejemplo de código ilustra esto.

class Persona:    def __init__(self, nombre, edad):        self.nombre = nombre        self.edad = edad        def __iter__(self):        return iter([self.nombre, self.edad])# Crear instancias de la clase Personapersona1 = Persona("Juan", 30)persona2 = Persona("Ana", 25)persona3 = Persona("Pedro", 35)# Combinar los objetos Personacomprimido = zip(persona1, persona2, persona3)# Iterar sobre el objeto comprimido e imprimir los elementosfor elemento in comprimido:    print(elemento)

Conclusión

La función zip es una función versátil que permite iteraciones simultáneas con una estructura de código simplificada. Se puede combinar con las funciones map, filter y reduce para lograr una manipulación de datos compleja utilizando pocas líneas de código.

Si te gusta este artículo, sígueme para más artículos sobre Python y el dominio del Aprendizaje Automático.