Esplorazione della funzione zip() di Python semplificazione dell’iterazione e della combinazione dei dati

Esplorazione della funzione zip() di Python per semplificare l'iterazione e la combinazione dei dati

Una guida per principianti per ottimizzare la manipolazione dei dati e l’iterazione con zip() in Python per un miglioramento dell’efficienza e della produttività

Foto di Tomas Sobek su Unsplash

Introduzione

Zip è una funzione integrata nell’interprete Python standard. È un metodo potente che facilita il lavoro con iterabili come dizionari e liste.

In questo articolo, esploreremo la sintassi e il funzionamento della funzione zip, acquisendo una comprensione pratica di come utilizzare il metodo in situazioni reali.

Sintassi

La definizione generale della funzione secondo la documentazione di Python:

zip(*iterabili, strict=False)

Dalla definizione, è evidente che il metodo prende un numero arbitrario di iterabili utilizzando l’argomento non-keyword *iterabili. Pertanto, possiamo passare qualsiasi numero di iterabili alla funzione zip, che verranno passati come un’unica lista di argomenti.

C’è un argomento di parola chiave ‘strict’ che esploreremo in seguito.

Esempio di caso d’uso 1

Per capire come utilizzare la funzione zip, esaminiamo questo frammento di codice interattivo.

Esempio 1 – Replit

Supponiamo di avere 3 liste diverse. Una contiene i prodotti e le altre due liste contengono la quantità di prodotti venduti e il loro prezzo.

Se vogliamo calcolare il totale delle vendite per ogni prodotto, possiamo farlo utilizzando un semplice ciclo for. Tuttavia, dovremo indicizzare ogni array e dobbiamo gestire i casi limite in caso di dimensioni diverse. Inoltre, la soluzione non è scalabile per un numero arbitrario di iterabili.

La funzione zip fornisce un’interfaccia semplice per eseguire tali compiti, in quanto è possibile passare tutti gli iterabili alla funzione zip.

Restituisce un iteratore di tuple, dove l’i-esima tupla contiene l’i-esimo elemento di ciascuno degli iterabili argomenti.

Quindi, per iterare sulle liste zippate nell’esempio precedente, ciascun prodotto verrà combinato con il suo prezzo e la sua quantità all’interno di una singola tupla. Questo può essere destrutturato per ottenere i valori durante l’iterazione.

Esegui il codice sopra per comprendere meglio il funzionamento della funzione zip.

Esempio di caso d’uso 2

Questo è un esempio più complesso. Supponiamo di avere una matrice bidimensionale e vogliamo calcolare la media di tutti i valori nella colonna.

Utilizzando il ciclo for possiamo iterare sulle righe di una matrice. Per la media delle colonne, dovremo utilizzare cicli nidificati per iterare separatamente sulle colonne.

Zip fornisce una soluzione alternativa.

trasposta = zip(*matrice)

Possiamo trasporre una matrice semplicemente passando tutte le righe come iterabili alla funzione zip. L’operatore * viene utilizzato per scomporre gli argomenti, quindi scompone la matrice per trasporla.

medie_colonne = [sum(colonna) / len(colonna) for colonna in trasposta]

Poi possiamo iterare su ogni colonna dell’iterabile zippato, per calcolare la media delle colonne.

Come scompattare gli iterabili

Ora che abbiamo compreso sia la funzione zip che l’operatore *, possiamo combinarli entrambi per invertire la funzione zip.

Una volta che abbiamo zippato insieme alcuni iterabili, possiamo recuperarli scomponendo tutte le tuple zippate e quindi zippandole insieme.

Esaminiamolo passo dopo passo:

prodotti = ['Mela', 'Banana', 'Ciliegia']prezzi = [1.5, 0.75, 2.25]quantita = [10, 15, 5]# Utilizzando zip() per combinare le listevendite = zip(prodotti, prezzi, quantita)

Prima diffondiamo gli iterabili, creando nuovi iterabili simili all’esempio della matrice trasposta sopra.

print(*vendite)# Output# ('Mela', 1.5, 10) ('Banana', 0.75, 15) ('Ciliegia', 2.25, 5)

Ora possiamo unirli insieme, in modo che tutti gli elementi in prima posizione siano membri del primo iterabile, tutti gli elementi in seconda posizione siano membri del secondo iterabile e così via.

È importante notare che una volta che si itera su un oggetto zip, viene esaurito, il che significa che l’oggetto zip diventa vuoto.

Quindi, facciamo tutto in una singola riga:

prodotti, prezzi, quantità = zip(*vendite)

Argomento di parola chiave rigoroso

La funzione zip consente di gestire iterabili di dimensioni diverse per impostazione predefinita. Se gli iterabili passati sono di dimensioni diverse, saranno zippati solo gli elementi fino all’iterabile più corto.

list(zip(range(3), ['fee', 'fi', 'fo', 'fum']))# Output [(0, 'fee'), (1, 'fi'), (2, 'fo')]

Tuttavia, la funzione zip viene principalmente utilizzata per iterabili delle stesse dimensioni. Per garantire questa restrizione, possiamo passare strict=True. Questo genererà un ValueError se c’è una corrispondenza di dimensioni tra gli argomenti iterabili.

Vantaggi dell’utilizzo di Zip

Efficienza di memoria

Zip è pigra. Gli iterabili vengono generati al volo durante l’iterazione. Quindi non è necessario creare una nuova lista per memorizzare gli iterabili zippati.

Flessibilità

Zip funziona con una vasta gamma di iterabili come liste, dizionari, tuple e stringhe. Può persino funzionare con classi definite dall’utente. Tutto quello che devi fare è implementare il metodo dunder __iter__ in Python. Un esempio di codice illustra questo.

class Persona:    def __init__(self, nome, età):        self.nome = nome        self.età = età        def __iter__(self):        return iter([self.nome, self.età])# Crea istanze della classe Personapersona1 = Persona("John", 30)persona2 = Persona("Alice", 25)persona3 = Persona("Bob", 35)# Zippa gli oggetti Personazippato = zip(persona1, persona2, persona3)# Itera sull'oggetto zippato e stampa gli elementifor elemento in zippato:    print(elemento)

Conclusione

La funzione zip è una funzione versatile che consente iterazioni simultanee con una struttura di codice semplificata. Può essere combinata con le funzioni map, filter e reduce per ottenere manipolazioni complesse dei dati utilizzando poche righe di codice.

Se ti piace questo articolo, seguimi per altri articoli sul dominio di Python e Machine Learning.