Storia della domanda
La funzione zip() è stata introdotta in Python come un modo conveniente per "cucire" insieme più sequenze in tuple con elementi corrispondenti, creando una sorta di struttura "matrice".
Problema
Si verifica un errore quando i programmatori usano zip per sequenze di lunghezza diversa, aspettandosi che il risultato sia della lunghezza della sequenza più lunga, oppure utilizzando in modo errato lo splicing durante la conversione inversa.
Soluzione
zip() accetta una o più sequenze e restituisce un iteratore di tuple, dove la n-esima tupla contiene gli n-esimi elementi di tutte le sequenze. L'iterazione termina al termine della sequenza più corta.
Esempio di codice:
names = ['John', 'Anna', 'Peter'] ages = [28, 22, 35] grouped = list(zip(names, ages)) print(grouped) # [('John', 28), ('Anna', 22), ('Peter', 35)]
Caratteristiche chiave:
Cosa succede se si passa a zip sequenze di lunghezza diversa?
Il risultato avrà la lunghezza della sequenza più corta. Gli altri elementi verranno ignorati.
zip([1,2,3], ['a','b']) # [(1,'a'), (2,'b')]
È possibile "espandere" zip? Come recuperare di nuovo le sequenze originali?
Sì, con l'asterisco-splicing e zip(*iterator):
pairs = [(1, "a"), (2, "b")] numbers, letters = zip(*pairs) print(numbers) # (1, 2)
Come si differenzia zip da itertools.zip_longest?
zip_longest di itertools lavora fino alla sequenza più lunga, riempiendo i vuoti con il valore di riempimento specificato.
from itertools import zip_longest zip_longest([1,2], ['a','b','c'], fillvalue=None) # [(1,'a'), (2,'b'), (None, 'c')]
Abbiamo elaborato coppie di utenti e password tramite zip, ma le liste si sono rivelate di lunghezza diversa. Diversi utenti non sono stati considerati a causa del comportamento di zip sulla lista corta.
Pro:
Contro:
Per unire i risultati del test e i nomi degli studenti, abbiamo utilizzato zip_longest con fillvalue="n/a", mantenendo i dati su tutti i partecipanti.
Pro:
Contro: