Come utilizzare la funzione zip() in Python (Combina Iterables)

Scopri come utilizzare la funzione zip() di Python per combinare più iterabili in parallelo. Masterizza le creazioni dei dizionari, decomprimi la logica e gestisci le mancate corrispondenze di lunghezza.

Prova questa soluzione nell'editor

Panoramica

Quando si esegue l'iterazione sui set di dati, spesso sarà necessario elaborare più elenchi correlati in parallelo. Ad esempio, associando un elenco di nomi utente a un elenco di ID utente o abbinando le coordinate dei valori X e Y. Invece di cicli nidificati o di accesso agli elementi utilizzando i contatori di indicizzazione delle liste, Python fornisce l'elegante funzione `zip()`.

La funzione `zip(*iterables)` accetta più iterabili come argomenti e li aggrega, restituendo un iteratore di tuple in cui l'i-esima tupla contiene l'i-esimo elemento da ciascuno degli iterabili di input. Ciò ti consente di scorrere facilmente due o più raccolte simultaneamente con un singolo ciclo "for".

Per impostazione predefinita, `zip()` interrompe la combinazione quando l'iterabile di input più breve viene esaurito. Tutti gli elementi rimanenti negli iterabili più lunghi vengono scartati. Se vuoi accoppiare elementi fino all'esaurimento dell'iterabile più lungo, riempiendo i valori mancanti con un segnaposto, Python fornisce `zip_longest()` nel modulo `itertools` della libreria standard.

Codice e output di esecuzione

Questo script dimostra l'iterazione di elenchi paralleli, la creazione di un dizionario utilizzando zip e la gestione delle mancate corrispondenze utilizzando zip_longest.

zip_function.py
Prova nell'editor
from itertools import zip_longest

names = ["Alice", "Bob", "Charlie"]
scores = [85, 90, 95]

# 1. Basic Zipping in a loop
print("--- Parallel Iteration ---")
for name, score in zip(names, scores):
    print(f"{name} scored {score}")

# 2. Creating a dictionary from two lists
user_dict = dict(zip(names, scores))
print("\nCreated Dictionary:", user_dict)

# 3. Handling unequal list lengths with zip_longest
extra_names = ["Alice", "Bob", "Charlie", "David"]
short_scores = [85, 90]

# Standard zip truncates
print("\nStandard zip output:", list(zip(extra_names, short_scores)))

# zip_longest fills missing values
zipped_long = list(zip_longest(extra_names, short_scores, fillvalue="N/A"))
print("zip_longest output:", zipped_long)
Uscita terminale
--- Parallel Iteration ---
Alice scored 85
Bob scored 90
Charlie scored 95

Created Dictionary: {'Alice': 85, 'Bob': 90, 'Charlie': 95}

Standard zip output: [('Alice', 85), ('Bob', 90)]
zip_longest output: [('Alice', 85), ('Bob', 90), ('Charlie', 'N/A'), ('David', 'N/A')]

Implementazione passo dopo passo

  • Passa gli elenchi multipli o gli iterabili che desideri combinare alla funzione zip().
  • Decomprimere le tuple generate in un'istruzione del ciclo for per iterazioni parallele pulite.
  • Converti l'oggetto zip in un dizionario utilizzando dict(zip(keys_list,values_list)) per la mappatura.
  • Importa itertools.zip_longest per combinare elenchi di lunghezza diversa senza perdere i valori di coda.

Domande frequenti

Come posso "decomprimere" una sequenza compressa di tuple?

È possibile decomprimere una sequenza in elenchi separati utilizzando l'operatore di decompressione *: list(zip(*zipped_tuples)).

zip() duplica gli elementi in memoria?

No, zip() restituisce un iteratore che produce elementi su richiesta, rendendolo estremamente efficiente in termini di memoria.

Argomenti correlati

Risorse Python consigliate

Espandi le tue conoscenze con tutorial interattivi, foglietti illustrativi e confronti di codici correlati.