Iterar con zip

zip es una funciΓ³n en Python que se utiliza para combinar elementos de varias secuencias (por ejemplo, listas, tuplas, etc.) en una sola secuencia de tuplas. La cabecera de la funciΓ³n zip es la siguiente:

zip(*iterables)
  • iterables: Una secuencia o varias secuencias que se quieren combinar.

Ejemplo:

colors = ['red', 'green', 'blue']
codes = [0xff0000, 0x00ff00, 0x0000ff]
color_codes = list(zip(colors, codes))
print(color_codes)

# Salida:
# [('red', 0xff0000), ('green', 0x00ff00), ('blue', 0x0000ff)]

En este ejemplo, estamos combinando los elementos de las listas colors y codes en una sola lista de tuplas color_codes.

Es importante destacar que zip genera un objeto de tipo zip, no una lista. Para convertirlo en una lista, se puede utilizar la funciΓ³n list.

Iterar con zip en Python es muy similar a iterar con enumerate, con la diferencia de que zip combina varias secuencias en lugar de mantener un registro del Γ­ndice.

Ejemplo:

colors = ['red', 'green', 'blue']
codes = [0xff0000, 0x00ff00, 0x0000ff]
for color, code in zip(colors, codes):
    print(color, code)

# Salida:
# red 0xff0000
# green 0x00ff00
# blue 0x0000ff

En este ejemplo, estamos iterando sobre las dos secuencias colors y codes utilizando zip. Cada iteraciΓ³n del bucle for asigna una tupla de elementos correspondientes a color y code.

Si las secuencias que estΓ‘s combinando con zip tienen diferentes longitudes, zip solo combinarΓ‘ los elementos hasta el final de la secuencia mΓ‘s corta.

zip() con diccionarios

Hasta ahora nos hemos limitado a usar zip con listas, pero la funciΓ³n estΓ‘ definida para cualquier clase iterable. Por lo tanto podemos usarla tambiΓ©n con diccionarios.

Si realizamos lo siguiente, a,b toman los valores de las key del diccionario. Tal vez algo no demasiado interesante.

esp = {'1': 'Uno', '2': 'Dos', '3': 'Tres'}
eng = {'1': 'One', '2': 'Two', '3': 'Three'}

for a, b in zip(esp, eng):
    print(a, b)

# 1 1
# 2 2
# 3 3

Sin embargo, si hacemos uso de la funciΓ³n items, podemos acceder al key y value de cada elemento.

esp = {'1': 'Uno', '2': 'Dos', '3': 'Tres'}
eng = {'1': 'One', '2': 'Two', '3': 'Three'}

for (k1, v1), (k2, v2) in zip(esp.items(), eng.items()):
    print(k1, v1, v2)

# 1 Uno One
# 2 Dos Two
# 3 Tres Three

NΓ³tese que en este caso ambas key k1 y k2 son iguales.

Deshacer el zip()

Con un pequeΓ±o truco, es posible deshacer el zip en una sola lΓ­nea de cΓ³digo. Supongamos que hemos usado zip para obtener c.

a = [1, 2, 3]
b = ["One", "Two", "Three"]
c = zip(a, b)

print(list(c))
# [(1, 'One'), (2, 'Two'), (3, 'Three')]

ΒΏEs posible obtener a y b desde c? SΓ­, tan sencillo como:

c = [(1, 'One'), (2, 'Two'), (3, 'Three')]
a, b = zip(*c)

print(a)  # (1, 2, 3)
print(b)  # ('One', 'Two', 'Three')

NΓ³tese el uso de *c, lo que es conocido como unpacking en Python.

Last updated