Un set è un sacchetto non ordinato di elementi unici
Dove liste e tuple tengono all'ordine, i set no. Dove le liste lasciano accumulare i duplicati, i set li scartano in silenzio. Il set è la struttura dati giusta quando hai due esigenze precise:
- Vuoi elementi unici, punto.
- Vuoi verificare l'appartenenza in fretta.
Si scrive con le parentesi graffe:
I duplicati "red" e "green" del secondo set semplicemente spariscono. Non è un errore: è proprio lo scopo.
Creare un set
I due modi che userai davvero:
Quest'ultimo punto frega tutti almeno una volta: {} crea un dizionario vuoto, non un set vuoto. L'ambiguità sintattica doveva cadere su uno dei due, e hanno vinto i dict.
Aggiungere e rimuovere
remove contro discard è la distinzione chiave: remove pretende che l'elemento sia presente; a discard non importa. Scegli in base a se l'assenza dell'elemento debba essere un errore.
Appartenenza veloce
Ecco dove i set si guadagnano davvero il loro posto. x in some_set viene eseguito in tempo costante, per quanto grande sia il set. x in some_list deve scorrere la lista, e diventa lento quando la lista è grande.
Regola pratica: ogni volta che ti ritrovi a scrivere if x in some_list dentro un ciclo, e la lista ha più di qualche decina di elementi, converti prima la lista in un set.
Matematica degli insiemi
Qui i set diventano davvero divertenti. Puoi combinarli con operatori che rispecchiano le operazioni matematiche sugli insiemi:
Ogni operatore ha anche una forma come metodo (.union(), .intersection(), .difference(), .symmetric_difference()). Gli operatori sono più compatti; i metodi accettano qualsiasi iterabile, non solo un altro set.
Eliminare i duplicati da una lista
Uno degli usi più comuni dei set, anche al di fuori della "logica degli insiemi":
Una riga, e i duplicati spariscono. Una cosa da notare: l'ordine non viene mantenuto. Se ti servono l'unicità e l'ordine originale, usa invece dict.fromkeys():
Nel Python moderno i dict mantengono l'ordine di inserimento, e dict.fromkeys ne costruisce uno usando come chiavi gli elementi dell'iterabile: in pratica un set ordinato.
Sottoinsiemi e sovrainsiemi
Verificare se un set è contenuto in un altro:
Tornano utili in cose come i controlli dei permessi ("questo utente ha tutti i ruoli richiesti?").
Cosa può stare in un set
Solo elementi hashable. È un termine tecnico; in pratica significa:
- Le cose immutabili sono hashable: numeri, stringhe, tuple di elementi hashable, frozenset.
- Le cose mutabili no: liste, dict e altri set non possono essere membri di un set.
Se ti serve un set di set, usa frozenset: è una versione immutabile del set.
L'iterazione non ha un ordine
Scorrere un set con un ciclo ti dà gli elementi senza un ordine garantito:
Eseguilo qualche volta e vedrai l'ordine cambiare. Se l'ordine conta, il set non è la struttura giusta: ordina il contenuto quando ti serve, oppure usa una lista.
Quando non usare un set
Se vale una di queste condizioni, probabilmente una lista o un dict fanno più al caso tuo:
- Ti interessa l'ordine.
- Devi memorizzare dei duplicati.
- Ogni elemento ha dei dati associati (usa un dict con l'elemento come chiave).
Andiamo avanti
I set gestiscono unicità e appartenenza. I dizionari, in arrivo nella prossima pagina, gestiscono lo schema più ampio del "cercare un valore tramite una chiave", probabilmente la struttura dati più utile di Python dopo la lista.
Domande frequenti
Cos'è un set in Python?
Un set è una collezione non ordinata di elementi unici. I set usano le parentesi graffe senza coppie chiave-valore: colors = {'red', 'green', 'blue'}. Aggiungere due volte lo stesso valore non ha alcun effetto: i duplicati vengono scartati in silenzio.
Quando dovrei usare un set invece di una lista?
Usa un set quando ti interessa l'unicità o quando farai molti controlli di appartenenza (x in collection). I set eliminano automaticamente i duplicati e verificano l'appartenenza in tempo costante, il che per collezioni grandi è un'accelerazione enorme rispetto alle liste.
Come creo un set vuoto in Python?
Usa set(), non {}: le parentesi graffe senza niente dentro creano un dizionario vuoto, non un set vuoto. Una volta che hai un set, puoi aggiungere elementi con .add(value).