Python Set union() – Una guida completa in 5 minuti

Python Set union() - Una guida completa in soli 5 minuti

I programmatori Python hanno diversi metodi per combinare due insiemi in uno. In questo articolo, esploreremo il metodo union() dell’insieme e vedremo alcuni esempi di come utilizzarlo. Discuteremo anche alcuni dei vantaggi dell’utilizzo di union() e vedremo perché è uno strumento popolare per i programmatori Python.

Infine, esamineremo alcuni casi d’uso avanzati ed esamineremo l’efficienza di union(). Quindi, cominciamo!

Unione di insiemi in Python – Le basi

In questa sezione, esamineremo la definizione di base e l’uso della funzione union() dell’insieme in Python, esploreremo la sua sintassi e il valore restituito.

Definizione e utilizzo di Unione di insiemi in Python

Prima di vedere alcuni esempi, iniziamo dalle basi. Cos’è union() di un insieme? Come ci si potrebbe aspettare, è una funzione che combina due insiemi in uno solo. La funzione può combinare un insieme con più insiemi o oggetti iterabili di Python.

Ad esempio, date un’occhiata ai seguenti due insiemi – A e B:

Immagine 1 - Unione di insiemi in Python - due insiemi (immagine dell'autore)

Immagine 1 – Unione di insiemi in Python – due insiemi (immagine dell’autore)

Calcolare l’unione tra questi insiemi significa creare un nuovo insieme che ha tutti gli elementi distinti di entrambi:

Immagine 2 - Unione di insiemi in Python - l'unione tra due insiemi (immagine dell'autore)

Immagine 2 – Unione di insiemi in Python – l’unione tra due insiemi (immagine dell’autore)

Spesso l’unione di insiemi in Python viene rappresentata con un diagramma di Venn. Ecco come appare:

Immagine 3 - Unione di insiemi in Python come diagramma di Venn (immagine dell'autore)

Immagine 3 – Unione di insiemi in Python come diagramma di Venn (immagine dell’autore)

L’insieme a sinistra ha gli elementi R e Julia che non sono presenti nell’insieme a destra. Allo stesso modo, l’insieme a destra ha JavaScript e Go come elementi distinti. C’è un elemento comune ad entrambi gli insiemi – Python.

Ricordate: se un elemento è presente in più di un insieme, viene elencato solo una volta nell’insieme risultante.

Sintassi di Unione di insiemi in Python

# Combinare due insiemit1.union(set2)# Combinare più insiemit1.union(set2, set3, ...)

Dove:

  • set1 – L’iterabile da unificare.
  • set2, set3 – Insiemi opzionali, altri oggetti iterabili da unificare.

Valore restituito di Unione di insiemi in Python

La funzione union() dell’insieme in Python restituisce un nuovo insieme che è l’unione di tutti gli insiemi con il primo – ma solo se è stato passato un insieme o oggetto(i) iterabile(i) alla funzione union().

Se non sono stati passati argomenti alla funzione union(), viene restituita una copia dell’insieme.

Esempio di funzione Unione di insiemi in Python

Dichiareremo due insiemi, proprio come nelle immagini sopra:

  • A – Contiene linguaggi di programmazione utilizzati nella scienza dei dati
  • B – Contiene linguaggi di programmazione utilizzati nello sviluppo web

Alcuni linguaggi di programmazione sono interscambiabili, come Python, quindi è presente in entrambi gli insiemi. Dovrebbe essere stampato solo una volta, come abbiamo visto in precedenza:

A = {'Python', 'R', 'Julia'}B = {'Python', 'JavaScript', 'Go'}print(f"A U B = {A.union(B)}")

Output:

A U B = {'Go', 'Python', 'JavaScript', 'R', 'Julia'}

Se non si specificano parametri alla funzione Python union(), l’insieme viene copiato:

print(f"A.union() = {A.union()}")

Output:

A.union() = {'R', 'Julia', 'Python'}

È possibile verificare che sia stato copiato stampando il suo indirizzo di memoria:

A = {'Python', 'R', 'Julia'}A_copy = A.union()print(hex(id(A)))print(hex(id(A_copy)))

Output:

0x105a03e400x105a039e0

Non vedrete i valori identici, e quella non è la questione. La cosa importante è che siano diversi, a indicare che l’insieme è stato copiato in un diverso indirizzo di memoria.

Esploreremo ora un modo più breve per ottenere l’unione di più insiemi.

Unione di insiemi Python utilizzando l’operatore |

Non c’è bisogno di chiamare la funzione union() per gli insiemi Python ogni volta. È possibile utilizzare l’operatore pipe (|):

A = {'Python', 'R', 'Julia'}B = {'Python', 'JavaScript', 'Go'}print(f"A U B = {A | B}")

Output:

A U B = {'Go', 'Python', 'JavaScript', 'R', 'Julia'}

Tutto il resto rimane uguale. Questo approccio è più compatto e leggibile rispetto al primo, almeno se si combinano due insiemi.

Esempi avanzati di unione di insiemi in Python

Esamineremo ora un paio di esempi e casi d’uso “avanzati” per l’unione:

  • Argomenti multipli di insiemi
  • Aggiornamento di un insieme vs. unione di un insieme
  • Unione in Python su oggetti iterabili

Argomenti multipli di insiemi

È possibile ottenere l’unione di un insieme con più insiemi. Dichiariamo un altro insieme contenente linguaggi di programmazione utilizzati nel calcolo scientifico e calcoliamo l’unione di tutti e tre gli insiemi.

Il calcolo funziona sia usando la sintassi normale che la sintassi abbreviata con il pipe:

A = {'Python', 'R', 'Julia'}B = {'Python', 'JavaScript', 'Go'}C = {'R', 'Matlab', 'Octave'}print(f"A U B U C = {A.union(B, C)}")print(f"A U B U C = {A | B | C}")

Output:

A U B U C = {'Octave', 'Go', 'Python', 'JavaScript', 'Matlab', 'R', 'Julia'}A U B U C = {'Octave', 'Go', 'Python', 'JavaScript', 'Matlab', 'R', 'Julia'}

Aggiornamento di un insieme vs. unione di un insieme

È possibile eseguire l’operazione di unione in Python sia con set.update() che con set.union(). Il primo aggiunge tutti gli elementi mancanti all’insieme su cui viene chiamato e restituisce None, mentre il secondo crea e restituisce un nuovo insieme.

Ecco come funziona set.update():

A = {'Python', 'R', 'Julia'}B = {'Python', 'JavaScript', 'Go'}A.update(B)print(A)

Output:

{'Go', 'Python', 'JavaScript', 'R', 'Julia'}

Come puoi vedere, l’aggiornamento avviene sul posto. Non puoi salvare i risultati dell’operazione di aggiornamento in un nuovo insieme, quindi tieni presente questo:

A = {'Python', 'R', 'Julia'}B = {'Python', 'JavaScript', 'Go'}C = A.update(B)print(C)

Output:

None

Unione in Python su oggetti iterabili

Puoi chiamare la funzione union() su un insieme Python e fornire come argomento un qualsiasi oggetto iterabile – ecco un esempio con una lista Python:

l1 = {1, 2, 3}l2 = [2, 3, 4]print(l1.union(l2))

Output:

{1, 2, 3, 4}

Tieni presente che non puoi usare l’operatore shorthand a pipe:

l1 = {1, 2, 3}l2 = [2, 3, 4]print(l1 | l2)

Output:

Image 4 - TypeError when trying to union Python set and list (image by author)

Immagine 4 – TypeError quando si cerca di fare l’unione di un insieme Python e una lista (immagine dell’autore)

Non puoi nemmeno utilizzare altro tipo di dato, se non un insieme Python, poiché nessun altro tipo di dato ha la funzione union():

l1 = [1, 2, 3]l2 = [2, 3, 4]print(l1.union(l2))

Output:

Image 5 - AttributeError when trying to call union() on a Python list (image by author)

Immagine 5 – AttributeError quando si cerca di chiamare union() su una lista Python (immagine dell’autore)

In breve – devi sempre utilizzare la funzione union() anziché l’operatore a pipe e devi chiamare la funzione su un insieme.

Prestazioni dell’unione degli insiemi in Python (Complessità temporale)

Analizzeremo ora la complessità temporale dell’operazione di unione degli insiemi in Python. Ho trovato il codice sorgente su Finxter blog e l’ho leggermente modificato. Per riassumere:

  • La complessità temporale su un insieme con n elementi e argomenti di insieme con m elementi è O(n + m).
  • L’inserimento di un elemento in un insieme ha una complessità di O(1).

Ecco il codice Python che calcola e mostra un grafico delle dimensioni dell’insieme sull’asse X e del tempo di esecuzione in secondi sull’asse Y. Ho eseguito il codice su M1 Pro MacBook Pro 16″:

import timeimport matplotlib.pyplot as pltplt.rcParams['figure.figsize'] = (12, 5)plt.rcParams['axes.spines.top'] = Falseplt.rcParams['axes.spines.right'] = False# Calcoli delle dimensionisizes = [i * 10**5 for i in range(100)]runtimes = []for size in sizes:    s = set(range(size))    t = set(range(0, size, 2))        t1 = time.time()    s.union(t)    t2 = time.time()        runtimes.append(t2 - t1)        # Plotplt.figure()plt.plot(sizes, runtimes, lw=3, color='#101010')plt.title('Tempo di esecuzione di set union() in Python rispetto alla dimensione dell\'insieme', size=20)plt.xlabel('Dimensione dell\'insieme', size=14)plt.ylabel('Tempo di esecuzione (s)', size=14);

Output:

Immagine 6 - Grafico della complessità temporale dell'unione degli insiemi in Python (immagine dell'autore)

Immagine 6 – Grafico della complessità temporale dell’unione degli insiemi in Python (immagine dell’autore)


Conclusione

L’unione degli insiemi in Python è semplice da comprendere. Abbiamo esaminato la definizione e l’intuizione e abbiamo gradualmente costruito il nostro percorso verso la comprensione di casi d’uso più complessi. Bisogna ammettere che anche la sezione avanzata era facile da digerire.

Articolo originariamente pubblicato qui. Ripubblicato con il permesso dell’autore.