Storia della questione:
Gli insiemi (set) sono stati introdotti in Python come un tipo incorporato a partire da Python 2.4 (prima erano implementati come modulo esterno). Consentono di memorizzare in modo efficiente elementi unici e non ordinati e supportano molte operazioni standard della teoria degli insiemi: unione, intersezione, differenza, differenza simmetrica e controllo dei sottoinsiemi.
Problema:
Senza set si devono utilizzare le liste, il che porta a una ricerca inefficace di elementi unici, rallentando gli algoritmi che utilizzano un gran numero di controlli di appartenenza. Il set è implementato tramite una tabella hash, quindi tutte le operazioni di ricerca, aggiunta e rimozione vengono eseguite in tempo ammortizzato O(1). Tuttavia, questa struttura può causare problemi imprevisti, come la perdita dell'ordine degli elementi, restrizioni sui tipi di elementi (devono essere immutabili e hashabili) e incomprensioni sulle peculiarità del confronto degli insiemi e sulle loro interazioni con altre strutture.
Soluzione:
Utilizzare set quando è necessario memorizzare solo elementi unici e eseguire operazioni della teoria degli insiemi. È importante ricordare che gli elementi devono essere hashabili (ad esempio, numeri, stringhe, tuple, ma non liste e dict). Per lavorare con set è fornito un ricco insieme di metodi incorporati (add, remove, union, intersection, difference, issubset, ecc.).
Esempio di codice:
s1 = {1, 2, 3, 4} s2 = {3, 4, 5} print(s1 | s2) # {1, 2, 3, 4, 5} (unione) print(s1 & s2) # {3, 4} (intersezione) print(s1 - s2) # {1, 2} (differenza) print(3 in s1) # True (controllo di appartenenza)
Caratteristiche chiave:
Si possono aggiungere tipi mutabili (come le liste) in un set?
No, gli elementi di un insieme devono essere hashabili e immutabili. Una lista o un dict non possono essere aggiunti in un set, Python solleverà un TypeError.
s = set() s.add([1, 2, 3]) # TypeError: tipo non hashable: 'list'
Un set mantiene l'ordine degli elementi?
No. Dalla creazione del set, gli elementi non vengono restituiti necessariamente nell'ordine in cui sono stati aggiunti, specialmente quando cambia la dimensione dell'insieme.
s = {5, 2, 8, 1} print(s) # L'ordine non è definito
Qual è la differenza tra set e frozenset e si può usare frozenset come elemento di un set?
frozenset è la variante immutabile di set. Può essere usato come elemento di un altro set o come chiave di un dict, poiché è hashabile.
fs = frozenset([1, 2, 3]) s = set() s.add(fs) # OK
Un sviluppatore ha voluto memorizzare elementi unici e ha scelto set, ignorando l'ordine in cui si presentavano. Di conseguenza, parte della logica aziendale che dipendeva dall'ordine di elaborazione ha smesso di funzionare.
Vantaggi:
Svantaggi:
Nella situazione in cui si dovevano filtrare velocemente record unici da un grande set, è stato scelto set, poiché l'importante era solo il fatto di unicità e non l'ordine. Le prestazioni sono migliorate notevolmente e il codice è stato semplificato.
Vantaggi:
Svantaggi: