python set strutture-dati insiemi

I Set in Python

Obiettivi della pillola

Alla fine di questa pillola saprai:

  • creare e inizializzare insiemi (set);
  • costruire un set a partire da una lista eliminando duplicati;
  • aggiungere e rimuovere elementi da un set;
  • utilizzare le principali operazioni insiemistiche (union, intersection, difference);
  • distinguere chiaramente un set da una list, in particolare sul tema dell’ordine.

Cos’è un set

Un set in Python rappresenta un insieme matematico: una collezione non ordinata di elementi unici. Si definisce con le graffe { } o con la funzione set().

frutti = {"mela", "banana", "pera"}
vuoto  = set()             # insieme vuoto

Nota: Non puoi creare un set vuoto con {}: in quel caso Python crea un dict.

Creare un set a partire da una lista

Spesso vogliamo eliminare duplicati da una lista: basta convertirla in un set. Questo è un metodo rapido per avere elementi unici.

lista = [1, 2, 2, 3, 3, 3, 4]
insieme = set(lista)
print(insieme)   # {1, 2, 3, 4}

Nota: Convertendo di nuovo in lista con list(set(...)) ottieni una lista senza duplicati, ma l’ordine originale potrebbe non essere preservato.

Set e ordine degli elementi

I set in Python sono non ordinati: non mantengono la sequenza di inserimento come le liste. Quando stampi o iteri su un set, l’ordine degli elementi può cambiare tra un’esecuzione e l’altra.

s = {"a", "b", "c", "d"}
print(s)     # l'ordine puo' variare, ad esempio {'a', 'c', 'b', 'd'}
for x in s:
    print(x) # non segue l'ordine di inserimento

Nota: Se hai bisogno di un insieme ordinato, puoi convertire il set in una lista e ordinarla:

s = {3, 1, 4, 2}
ordinato = sorted(s)
print(ordinato)   # [1, 2, 3, 4]

Aggiungere e rimuovere elementi

add() per aggiungere

numeri = {1, 2, 3}
numeri.add(4)
print(numeri)     # {1, 2, 3, 4}

remove() e discard() per eliminare

numeri = {1, 2, 3}
numeri.remove(2)     # elimina 2
print(numeri)        # {1, 3}

numeri.discard(99)   # non genera errore se non presente

pop() e clear()

s = {"a", "b", "c"}
print(s.pop())   # rimuove e restituisce un elemento casuale
s.clear()        # svuota l'insieme
print(s)         # set()

Operazioni insiemistiche

Unione

a = {1, 2, 3}
b = {3, 4, 5}
print(a | b)             # {1, 2, 3, 4, 5}
print(a.union(b))        # stesso risultato

Intersezione

print(a & b)             # {3}
print(a.intersection(b))

Differenza e differenza simmetrica

print(a - b)             # {1, 2}
print(b - a)             # {4, 5}
print(a ^ b)             # {1, 2, 4, 5}  (elementi esclusivi)

Iterare su un set

Come le liste, anche i set si possono scorrere con un ciclo, ma l’ordine non è garantito.

colori = {"rosso", "verde", "blu"}
for c in colori:
    print(c)

Differenze tra set e list

  • Ordine: le liste mantengono l’ordine di inserimento, i set no.
  • Duplicati: le liste possono contenere elementi ripetuti, i set eliminano i duplicati automaticamente.
  • Operazioni: i set hanno operazioni insiemistiche (union, intersection, …), le liste no.
  • Indicizzazione: nelle liste puoi accedere con un indice (lista[0]), nei set no.
lista = [1, 2, 2, 3]
insieme = {1, 2, 2, 3}
print(lista)    # [1, 2, 2, 3]
print(insieme)  # {1, 2, 3}

In breve: usa una lista quando ti serve ordine e duplicati; usa un set quando ti servono elementi unici e operazioni insiemistiche.