Tiempo estimado de lectura: 3 minutos
A veces necesitas una función que te ayude a agregar o combinar varios iterables de una sola vez.
Cuando leemos la documentación oficial de Python dice que usando zip " Itera sobre varios iterables en paralelo, produciendo tuplas con un ítem de cada uno."
¿Qué significa eso en realidad?
En esencia, lo que significa es que si quieres combinar dos conjuntos de datos para que estén uno al lado del otro en el orden en el que están, utilizar zip te ayudará a conseguirlo.
Veamos un ejemplo. En el código siguiente, utilizamos zip en un bucle.
Como se puede ver, se trata de un bucle sobre dos listas diferentes y luego combinarlas en tres tuplas separadas:
for item in zip([1, 2, 3], ['Liverpool', 'Manchester Utd', 'Manchester City']):
print(item)
print(type(item))
La salida del código anterior muestra:
(1, 'Liverpool')
<class 'tuple'>
(2, 'Manchester Utd')
<class 'tuple'>
(3, 'Manchester City')
<class 'tuple'>
Como puede verse, la salida son tres tuplas diferentes.
¿Zip utiliza por defecto tuplas cuando da salida?
Sí, lo hace por defecto, pero hay otras formas de conseguir una salida diferente. Por ejemplo, si desea utilizar la comprensión de listas para obtener un conjunto de listas, haga lo siguiente:
y = [list(x) for x in zip([1,2,3], ['Liverpool', 'Manchester Utd','Manchester City'])]
print(y)
print(type(y))
Dando la siguiente salida:
[[1, 'Liverpool'], [2, 'Manchester Utd'], [3, 'Manchester City']]
<class 'list'>
¿Es necesario procesar la función zip antes de que dé una salida?
Sí, lo hace, el diseño de la función zip determina que es perezosa, como resultado, si no usas un bucle en ella o la envuelves dentro de una lista por ejemplo, no dará la salida que deseas.
Si se ejecuta lo siguiente:
a = [1,2]
b =['j','k']
c= zip(a,b)
print(c)
print(type(c))
Da este resultado:
<zip object at 0x000001330E1E8D40>
<class 'zip'>
Por otro lado, si utiliza una lista por ejemplo, la salida será una lista como la siguiente:
a = [1,2]
b =['j','k']
c= list(zip(a,b))
print(c)
print(type(c))
Dándote:
[(1, 'j'), (2, 'k')]
<class 'list'>
¿Puedo descomprimir un conjunto de datos?
Python no tiene una función para descomprimir, pero han proporcionado la funcionalidad de la siguiente manera.
Es bastante sencillo descomprimir, como puedes ver hemos puesto un asterisco al lado de "d" abajo, que es lo que Python reconoce para realizar una operación de descompresión.
a = [1,2]
b =['j','k']
c= list(zip(a,b))
print(c)
print(type(c))
d,f = zip(*c)
print(d,f)
Y el resultado es, la salida en una tupla:
[(1, 'j'), (2, 'k')]
<class 'list'>
(1, 2) ('j', 'k')
¿Qué ocurre si los iteradores tienen longitudes diferentes?
Esencialmente, el código se completará sin errores, pero sólo devolverá la salida basada en el iterador con la menor cantidad de valores en él.
Por ejemplo, a,b son los iteradores, pero como b sólo tiene dos valores, sólo se devuelven dos valores en la salida:
a = [1,2,3,4]
b =['j','k']
c= list(zip(a,b))
print(c)
print(type(c))
Lo que da lo siguiente. Observa que los dos primeros elementos del iterador A se unen con los dos elementos del iterador b.
[(1, 'j'), (2, 'k')]
<class 'list'>
¿Puedo enumerar utilizando la función zip?
La función zip es muy versátil y se puede enumerar, el siguiente es un ejemplo:
country = ['Ireland', 'England', 'Wales']
capital = ['Dublin', 'London', 'Cardiff']
for i, (country, capital) in enumerate(zip(country, capital)):
print(i, country, capital)
El resultado es el siguiente:
0 Ireland Dublin
1 England London
2 Wales Cardiff
¿Para qué sirve la función Zip?
- Crear comparaciones - Si tiene dos listas, por ejemplo, se puede utilizar para comparar las dos y luego mostrar las diferencias.
- También puede utilizarse para emparejar datos y realizar operaciones con esos datos emparejados.
- Se puede utilizar para ordenar listas basándose en los valores de una lista que se encuentran en una posición determinada de otra lista.