Python Set: operazioni di confronto veloce tra collezioni di dati

by theArchitect
SHARE
Python Set: operazioni di confronto veloce tra collezioni di dati
© Guida-HTML5.it

Introduzione

In Python, i set sono strutture dati fondamentali quando devi gestire insiemi di elementi unici e vuoi ottenere prestazioni elevate nelle operazioni di confronto. Un caso d’uso molto pratico, spesso sottovalutato, è il confronto rapido tra collezioni: capire quali elementi sono presenti in una lista ma non in un’altra, individuare elementi comuni, verificare se due insiemi di dati coincidono oppure trovare differenze in modo efficiente.

Questo scenario è frequente in applicazioni reali: sincronizzazione di utenti tra sistemi diversi, confronto di tag, validazione di permessi, analisi di dataset, controllo di inventari o verifica di record importati da file esterni. In tutti questi casi, usare i set al posto di cicli annidati o controlli manuali può semplificare il codice e migliorare sensibilmente le prestazioni.

In questo tutorial vedremo come usare i set per confrontare collezioni in modo pulito, leggibile e veloce, con esempi concreti e best practice utili per il lavoro quotidiano.

Codice completo

# Esempio pratico: confronto tra due liste di ID utente provenienti da sistemi diversi

sistema_a = [101, 102, 103, 104, 105, 106]
sistema_b = [104, 105, 106, 107, 108]

# Conversione in set per sfruttare operazioni insiemistiche
set_a = set(sistema_a)
set_b = set(sistema_b)

# Elementi presenti in A ma non in B
solo_in_a = set_a - set_b

# Elementi presenti in B ma non in A
solo_in_b = set_b - set_a

# Elementi comuni
in_entrambi = set_a & set_b

# Verifica se i due set contengono gli stessi elementi
uguali = set_a == set_b

print("Solo in A:", solo_in_a)
print("Solo in B:", solo_in_b)
print("Comuni:", in_entrambi)
print("Sono uguali?", uguali)

print("n--- Caso pratico: controllo accessi ---")

# Permessi richiesti da una funzionalità
permessi_richiesti = {"read", "write", "export"}

# Permessi effettivamente assegnati a un utente
permessi_utente = {"read", "export"}

# Verifica se l´utente ha tutti i permessi necessari
ha_tutti_i_permessi = permessi_richiesti.issubset(permessi_utente)

# Individua i permessi mancanti
permessi_mancanti = permessi_richiesti - permessi_utente

print("Ha tutti i permessi?", ha_tutti_i_permessi)
print("Permessi mancanti:", permessi_mancanti)

print("n--- Caso pratico: confronto di tag ---")

articolo_1 = {"python", "programmazione", "backend", "tutorial"}
articolo_2 = {"python", "tutorial", "set", "dati"}

# Unione: tutti i tag distinti dei due articoli
tutti_i_tag = articolo_1 | articolo_2

# Differenza simmetrica: elementi presenti in uno solo dei due set
tag_differenti = articolo_1 ^ articolo_2

print("Tutti i tag:", tutti_i_tag)
print("Tag differenti:", tag_differenti)

Spiegazione

Il punto centrale è semplice: un set memorizza elementi unici e supporta operazioni matematiche tra insiemi. Quando devi confrontare collezioni, queste operazioni sono molto più espressive e spesso più efficienti rispetto a soluzioni basate su liste.

1. Conversione da lista a set

Le liste sono utili per mantenere l’ordine e consentire duplicati, ma non sono ideali per il confronto tra collezioni. Convertendo una lista in set ottieni due vantaggi:

  • rimuovi automaticamente i duplicati;
  • puoi usare operatori come -, &, | e ^.

Nel codice:

set_a = set(sistema_a)
set_b = set(sistema_b)

da quel momento puoi eseguire confronti diretti tra i due insiemi.

2. Differenza tra set

L’operazione set_a - set_b restituisce gli elementi presenti in A ma non in B. È perfetta per trovare record mancanti, elementi non sincronizzati o dati esclusivi di una fonte.

solo_in_a = set_a - set_b

Nel nostro esempio, gli ID 101, 102 e 103 sono presenti solo nel sistema A.

3. Intersezione

L’operazione set_a & set_b restituisce gli elementi comuni. È utile per sapere quali dati coincidono tra due collezioni, per esempio utenti presenti in entrambi i sistemi, tag condivisi o prodotti comuni tra due cataloghi.

in_entrambi = set_a & set_b

Qui otteniamo gli ID 104, 105 e 106.

4. Confronto di uguaglianza

Con set_a == set_b puoi verificare se due collezioni contengono esattamente gli stessi elementi, indipendentemente dall’ordine. Questo è molto importante: nei set l’ordine non conta.

uguali = set_a == set_b

Questa verifica è molto più pulita rispetto a confrontare liste ordinate o a scrivere cicli personalizzati.

5. Sottoinsieme e controllo di completezza

Il metodo issubset() è utile quando vuoi sapere se un set è contenuto in un altro. Nel caso dei permessi, è una soluzione molto naturale:

ha_tutti_i_permessi = permessi_richiesti.issubset(permessi_utente)

Se restituisce False, puoi calcolare facilmente i permessi mancanti con la differenza:

permessi_mancanti = permessi_richiesti - permessi_utente

6. Differenza simmetrica

L’operazione ^ restituisce gli elementi presenti in uno solo dei due set. È molto utile quando vuoi evidenziare tutto ciò che è diverso tra due collezioni, senza distinguere tra “solo in A” e “solo in B”.

tag_differenti = articolo_1 ^ articolo_2

Nel nostro esempio, questa operazione è perfetta per confrontare i tag di due articoli e capire quali sono esclusivi di ciascuno.

Best practice

  • Usa i set quando ti serve unicità e confronto rapido: se l’ordine non è importante, i set sono spesso la scelta migliore.
  • Evita cicli annidati per cercare corrispondenze: per grandi quantità di dati, le operazioni sui set sono più leggibili e in genere più efficienti.
  • Converti le liste in set solo quando serve: se devi mantenere l’ordine originale o i duplicati, conserva anche la lista.
  • Usa operatori insiemistici chiari: - per differenza, & per intersezione, | per unione, ^ per differenza simmetrica.
  • Ricorda che i set non sono indicizzati: non puoi accedere a un elemento con [0]. Se ti serve un ordine, valuta list() dopo il confronto.
  • Attenzione agli elementi mutabili: un set può contenere solo elementi hashable, quindi non puoi inserire liste o dizionari direttamente.

Riepilogo

I set sono una soluzione elegante e potente per confrontare collezioni di dati in Python. Grazie alla loro natura insiemistica, puoi esprimere in poche righe operazioni che altrimenti richiederebbero molto più codice: differenze, elementi comuni, uguaglianze, sottoinsiemi e differenze simmetriche.

Il vantaggio non è solo estetico. I set rendono il codice più chiaro e spesso più performante, soprattutto quando lavori con grandi quantità di dati o con controlli ripetuti. Se il tuo problema riguarda “quali elementi ci sono”, “quali mancano” o “quali coincidono”, i set sono quasi sempre una scelta da considerare per prima.

Approfondisci con risorse ufficiali

  • Documentazione Python sui set: https://docs.python.org/3/library/stdtypes.html#set-types-set-frozenset
  • Operazioni sugli insiemi in Python: https://docs.python.org/3/library/stdtypes.html#mapping-types-dict
  • Glossario Python: hashable: https://docs.python.org/3/glossary.html#term-hashable
  • Tutorial ufficiale Python: https://docs.python.org/3/tutorial/datastructures.html

SHARE