ProgrammazioneSviluppatore Backend Python

Spiegate come funziona la funzione zip() in Python, a cosa serve e quali caratteristiche bisogna considerare quando si elaborano sequenze di lunghezza diversa.

Supera i colloqui con l'assistente IA Hintsage

Risposta.

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:

  • Restituisce un iteratore pigro, non crea una lista completamente in memoria.
  • L'iterazione continua fino alla sequenza più corta.
  • Consente di "espandere" facilmente i dati di nuovo utilizzando lo splicing e zip(*...)

Domande complicate.

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')]

Errori tipici e anti-pattern

  • Aspettarsi che zip crei coppie nella lunghezza massima.
  • Comportamento poco chiaro con sequenze vuote: zip è immediatamente vuoto.
  • Utilizzare zip senza convertirlo in lista in Python 3: zip è un iteratore, potrebbe essere esaurito dopo l'attraversamento.

Esempio dalla vita reale

Caso negativo

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:

  • Codice conciso.

Contro:

  • Perdita di informazioni.
  • Difficile da eseguire il debug quando la causa è la perdita di dati.

Caso positivo

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:

  • I vuoti sono chiaramente visibili.
  • Nessuno è stato perso durante l'elaborazione.

Contro:

  • Necessità di importare un modulo aggiuntivo.