W3docs

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

python— editable, runs on the server

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

python— editable, runs on the server

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 unordered

Per verificare se un valore specifico esiste, usa l'operatore in:

colors = {"red", "green", "blue"}
print("red" in colors)    # True
print("yellow" in colors) # False

Il 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

python— editable, runs on the server

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.

MetodoComportamento 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

python— editable, runs on the server

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)           # False

isdisjoint() restituisce True quando due set non condividono alcun elemento:

x = {1, 2, 3}
y = {4, 5, 6}
print(x.isdisjoint(y))  # True

Vedi 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])  # editor

Quando 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

python— editable, runs on the server

Verificare se due liste condividono elementi

Verificare se due liste hanno elementi in comune in Python usando i set

python— editable, runs on the server

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 elements

Trovare 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)
OperazioneMetodoOperatore
Unionea.union(b)a | b
Intersezionea.intersection(b)a & b
Differenzaa.difference(b)a - b
Differenza simmetricaa.symmetric_difference(b)a ^ b
Test di sottoinsiemea.issubset(b)a <= b
Test di sovrainsiemea.issuperset(b)a >= b
Test di disgiunzionea.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

Esercitazione

Pratica
What are the characteristics and features of a Python set?
What are the characteristics and features of a Python set?
Was this page helpful?