Set in Python
Impara i set in Python: crea set, aggiungi/rimuovi elementi, usa unione, intersezione, differenza, differenza simmetrica e frozenset.
Un set in Python è una collezione non ordinata di elementi unici e hashable. Poiché i set garantiscono l'unicità automaticamente e supportano test di appartenenza veloci, sono ideali per la deduplicazione, l'algebra degli insiemi matematici e il controllo delle sovrapposizioni tra collezioni.
Questo capitolo tratta:
- Come creare set (sintassi letterale e
set()) - Aggiungere e rimuovere elementi — e quando ogni metodo genera un errore
- Le quattro operazioni sugli insiemi: unione, intersezione, differenza, differenza simmetrica
- Operatori abbreviati (
|,&,-,^) - Test di sottoinsieme e sovrainsieme
- Comprensioni di set
- Set congelati (
frozenset) per set immutabili e hashable
Creare Set
Usare le parentesi graffe
Il modo più rapido per creare un set non vuoto è con un letterale tra parentesi graffe. Ogni valore appare una sola volta, indipendentemente da quante volte lo si scriva.
Definire un set in Python
Usare il costruttore set()
Passa qualsiasi iterabile — una lista, tupla, string o range — a set() per costruire un set da esso. I valori duplicati vengono eliminati silenziosamente.
Convertire una lista in un set in Python
Importante: set vuoto
Per creare un set vuoto devi usare set(). Scrivere {} crea un dizionario vuoto, non un set.
empty_set = set() # correct
empty_dict = {} # this is a dict!
print(type(empty_set)) # <class 'set'>
print(type(empty_dict)) # <class 'dict'>Cosa può contenere un set?
Un elemento di un set deve essere hashable — i tipi immutabili come int, float, str, bool e tuple funzionano correttamente. Le liste e altri set non possono essere elementi perché sono mutabili e quindi non hashable.
valid = {1, "hello", (2, 3), True} # OK
# invalid = {[1, 2]} # TypeError: unhashable type: 'list'
print(valid)Accedere agli Elementi del Set
I set sono non ordinati, quindi gli elementi non hanno un indice e non è possibile recuperare un singolo elemento per posizione. Il modo standard per visitare ogni elemento è un ciclo for.
colors = {"red", "green", "blue"}
for color in colors:
print(color)
# Output order may vary — sets are unorderedPer verificare se un valore specifico esiste, usa l'operatore in:
colors = {"red", "green", "blue"}
print("red" in colors) # True
print("yellow" in colors) # FalseIl test di appartenenza su un set è O(1) in media — molto più veloce della ricerca in una lista quando le collezioni sono grandi.
Per un capitolo dedicato, vedi Accedere agli elementi del set.
Aggiungere Elementi
Usa add() per inserire un singolo elemento, oppure update() per aggiungere più elementi da qualsiasi iterabile.
Aggiungere un elemento a un set in Python
update() accetta qualsiasi iterabile e aggiunge tutti i suoi elementi:
my_set = {1, 2, 3}
my_set.update([4, 5], {6, 7})
print(my_set) # {1, 2, 3, 4, 5, 6, 7}Vedi Aggiungere elementi al set per maggiori dettagli.
Rimuovere Elementi
Python offre diversi metodi per rimuovere elementi, ognuno con un comportamento diverso quando l'elemento è assente.
| Metodo | Comportamento se l'elemento è assente |
|---|---|
remove(x) | Genera KeyError |
discard(x) | Non fa nulla (sicuro) |
pop() | Rimuove e restituisce un elemento arbitrario; genera KeyError se il set è vuoto |
clear() | Rimuove tutti gli elementi |
Rimuovere un elemento da un set in Python
Quando scegliere remove vs discard: usa remove() quando l'elemento dovrebbe essere presente e la sua assenza indica un bug. Usa discard() quando l'elemento potrebbe esserci o meno e vuoi semplicemente rimuoverlo.
Vedi Rimuovere elementi dal set per tutti i metodi di rimozione.
Operazioni sugli Insiemi
I set in Python implementano le quattro classiche operazioni dell'algebra degli insiemi. Ogni operazione è disponibile sia come metodo che come operatore — scegli quello che è più chiaro nel contesto.
Operazioni sugli insiemi in Python
set1 = {1, 2, 3}
set2 = {2, 3, 4}
# Union — all elements from both sets
print(set1.union(set2)) # {1, 2, 3, 4}
print(set1 | set2) # {1, 2, 3, 4}
# Intersection — only elements present in both
print(set1.intersection(set2)) # {2, 3}
print(set1 & set2) # {2, 3}
# Difference — elements in set1 but not set2
print(set1.difference(set2)) # {1}
print(set1 - set2) # {1}
# Symmetric difference — elements in either set, but not both
print(set1.symmetric_difference(set2)) # {1, 4}
print(set1 ^ set2) # {1, 4}Test di sottoinsieme e sovrainsieme
Usa issubset(), issuperset(), o gli operatori di confronto <= / >= per testare le relazioni di contenimento.
a = {1, 2}
b = {1, 2, 3, 4}
print(a.issubset(b)) # True — every element of a is in b
print(a <= b) # True
print(b.issuperset(a)) # True — b contains all elements of a
print(b >= a) # True
print(a < b) # True — proper subset (a != b)
print(a == b) # Falseisdisjoint() restituisce True quando due set non condividono alcun elemento:
x = {1, 2, 3}
y = {4, 5, 6}
print(x.isdisjoint(y)) # TrueVedi Unire i set per le varianti di aggiornamento in-place come |=, &=, -= e ^=.
Comprensioni di Set
Come le comprensioni di liste, puoi costruire un set con un'espressione compatta usando parentesi graffe e una clausola for.
squares = {x ** 2 for x in range(1, 6)}
print(squares) # {1, 4, 9, 16, 25}
# With a filter condition
even_squares = {x ** 2 for x in range(1, 11) if x % 2 == 0}
print(even_squares) # {4, 16, 36, 64, 100}Poiché il risultato è un set, i valori duplicati vengono automaticamente eliminati:
words = ["apple", "banana", "avocado", "blueberry"]
first_letters = {w[0] for w in words}
print(first_letters) # {'a', 'b'}Set Congelati
Un frozenset è una versione immutabile di un set. Una volta creato, gli elementi non possono essere aggiunti o rimossi. I frozen set sono hashable, il che significa che possono essere usati come chiavi di dizionario o come elementi di un altro set.
fs = frozenset([1, 2, 3])
print(fs) # frozenset({1, 2, 3})
# All read-only operations work
print(2 in fs) # True
print(fs | {4, 5}) # frozenset({1, 2, 3, 4, 5})
# fs.add(4) # AttributeError — frozenset has no add()
# Use as a dictionary key
permissions = {
frozenset(["read", "write"]): "editor",
frozenset(["read"]): "viewer",
}
user_perms = frozenset(["read", "write"])
print(permissions[user_perms]) # editorQuando usare frozenset: ogni volta che hai bisogno di un oggetto simile a un set che non deve cambiare — come configurazione costante, chiave sicura per dizionario, o quando si condivide un set tra thread senza blocchi.
Esempi Pratici
Rimuovere duplicati da una lista
Convertire in un set e riconvertire è il modo più semplice per deduplicare una lista. Nota che l'ordine originale non viene preservato; se l'ordine è importante, usa invece dict.fromkeys().
Rimuovere duplicati da una lista usando un set in Python
Verificare se due liste condividono elementi
Verificare se due liste hanno elementi in comune in Python usando i set
isdisjoint() è un'alternativa più diretta per questa verifica:
list1 = [1, 2, 3]
list2 = [4, 5, 6]
print(not set(list1).isdisjoint(set(list2))) # False — no common elementsTrovare tag univoci tra articoli
article_a_tags = {"python", "tutorial", "beginner"}
article_b_tags = {"python", "advanced", "data-science"}
all_tags = article_a_tags | article_b_tags
shared_tags = article_a_tags & article_b_tags
only_in_a = article_a_tags - article_b_tags
print("All tags: ", all_tags)
print("Shared tags: ", shared_tags)
print("Only in A: ", only_in_a)Riepilogo
| Operazione | Metodo | Operatore |
|---|---|---|
| Unione | a.union(b) | a | b |
| Intersezione | a.intersection(b) | a & b |
| Differenza | a.difference(b) | a - b |
| Differenza simmetrica | a.symmetric_difference(b) | a ^ b |
| Test di sottoinsieme | a.issubset(b) | a <= b |
| Test di sovrainsieme | a.issuperset(b) | a >= b |
| Test di disgiunzione | a.isdisjoint(b) | — |
Capitoli correlati: Aggiungere elementi al set · Rimuovere elementi dal set · Accedere agli elementi del set · Iterare sui set · Unire i set · Metodi dei set