In Python, la funzione zip() serve ad aggregare in un unico iteratore che contiene un insieme di tuple con gli elementi di ogni iteratore che gli passiamo.

Sintassi

Come parametri in ingresso abbiamo zero o più iteratori(liste, stringhe, etc..)

zip(*iterabili)

Come risultato otteniamo un iteratore di tuple dove il numero di tuple è uguale al numero di iterabili passati alla funzione.

Come funziona zip() in Python

x = [23, 12, 38, 10]
y = [1, 3, 6, 7]
z = [2, 10, 3, 4]
aggregato = zip(x, y, z)

""" converto l'iterabile in una lista """
aggregato = list(aggregato)

print(aggregato)

#output
[(23, 1, 2), (12, 3, 10), (38, 6, 3), (10, 7, 4)]

Come vedi vengono processati in parallelo gli elementi di ogni sequenza passata alla funzione. Vediamo ora cosa succede se abbiamo iteratori di diversa lunghezza tra loro:

x = [23, 12]
y = [1, 3, 6, 7]

""" in questo caso x ha meno elementi di y """
aggregato = zip(x, y)

""" converto l'iterabile in una lista """
aggregato = list(aggregato)

print(aggregato)

#output
[(23, 1), (12, 3)]

Possiamo dedurre quindi che zip() si ferma quando l'iteratore più piccolo è stato processato.

Usare zip() in un for loop

Come detto in precedenza, questa funzione ci permette di processare in parallelo gli elementi di ogni sequenza.

Supponiamo quindi di avere tre liste, una che rappresenta i mesi, un altra le entrate e infine una che rappresenta le spese e vogliamo calcolare il guadagno di ogni mese:

mesi = ["Gennaio", "Febbraio", "Marzo"]
entrate = [300, 250, 400]
spese = [100, 320, 80]
for mese, entrata, spesa in zip(mesi, entrate, spese):
guadagno = entrata - spesa
print("Guadagno nel mese di {0} : {1}".format(mese, guadagno))

#output
Guadagno nel mese di Gennaio : 200
Guadagno nel mese di Febbraio : -70
Guadagno nel mese di Marzo : 320

Iterare con il for loop con i dizionari:

calciatore_1 = {"Nome": "Giorgio", "Cognome": "Chiellini", "Squadra": "Juventus"}
calciatore_2 = {"Nome": "Andrea", "Cognome": "Ranocchia", "Squadra": "Inter"}

for (key1, value1), (key2, value2) in zip(calciatore_1.items(), calciatore_2.items()):
print(key1, value1)
print(key2, value2)
print("------")

#output
Nome Giorgio
Nome Andrea
------
Cognome Chiellini
Cognome Ranocchia
------
Squadra Juventus
Squadra Inter
------

Unzippare i valori usando zip()

Ora che sai come aggregare più sequenze in una, vediamo come fare l'operazione contraria, ovvero unzippare un iteratore sfruttando l'operatore di unpack *:

x = [5, 33, 16, 9]
y = [4, 14, 459, 213]

aggregato = zip(x, y)

""" converto l'iterabile in una lista """
aggregato = list(aggregato)
print("Iteratore aggregato: {0}".format(aggregato))

a, b = zip(*aggregato)

print("x = {0}".format(a))
print("y = {0}".format(b))

#output
Iteratore aggregato: [(5, 4), (33, 14), (16, 459), (9, 213)]
x = (5, 33, 16, 9)
y = (4, 14, 459, 213)


Condividi sui Social