Le funzioni disponibili in Python per i set sono in linea di massima le stesse descritte in precedenza per le liste e le tuple, motivo per il quale non sarà necessario ripeterle. Più interessante è analizzare alcuni utilizzi pratici dei set che si prestano in modo particolare ad operazioni di insieminstica come le unioni, le intersezioni, le differenze e le differenze simmetriche.
Set e unioni
Considerati due set, un’unione sarà a sua volta un set composto dagli elementi di entrambi i set. Per determinare un’unione è possibile utilizzare l’operatore "|" in questo modo:
# Creare l'unione di due set
>>> a_set = {'a','b','c'}
>>> b_set = {'d','e','f'}
>>> a_set | b_set
{'b', 'd', 'a', 'c', 'f', 'e'}
In alternativa è possibile ottenere il medesimo risultato ricorrendo al metodo union() utilizzabile in questo modo:
# Unione di due set con union()
>>> a_set.union(b_set)
{'b', 'd', 'a', 'c', 'f', 'e'}
>>> b_set.union(a_set)
{'b', 'd', 'a', 'c', 'f', 'e'}
In ogni caso verrà generato un set contenente gli elementi di entrambi i set coinvolti. Nel caso in cui due set dovessero contenere elementi comuni, questi verranno inseriti una volta sola nel set risultante:
# Unione di set con elementi comuni
>>> a_set = {'a','b','c','d'}
>>> b_set = {'d','e','f'}
>>> a_set | b_set
{'b', 'd', 'a', 'c', 'f', 'e'}
Set e intersezioni
Le intersezioni permettono di accedere agli elementi comuni di due set, in sostanza un’intersezione permette di generare un set composto dagli elementi in comune dei set coinvolti nell’operazione. Un primo modo di eseguire un’intersezione è quello che prevede l’utilizzo dell’operatore"&":
# Generare l'intersezione di due set
>>> a_set = {'2','5','7','9'}
>>> b_set = {'3','9','2','8'}
>>> a_set & b_set
{'2', '9'}
Anche in questo caso disponiamo di una modalità alternativa basata sull’impiego di un metodo,intersection(), che se applicato ai due set precedentemente definiti, permetterà di ottenere lo stesso risultato di "&":
# Generare l'intersezione di due set con intersection()
a_set.intersection(b_set)
{'2', '9'}
>>> b_set.intersection(a_set)
{'9', '2'}
L’unica differenza riguarda la disposizione degli elementi che cambierà a seconda di quale set verrà scelto per la chiamata al metodo ("set.metodo") e quale verrà utilizzato come parametro per il passaggio al metodo (tra parentesi tonde).
Set e differenze
Per spiegare come ottenere differenze tra set si parta immediatamente da un esempio pratico: dati due set "x" ed "y", "x-y" permetterà di generare un set di elementi presenti in "x" ma non in "y", mentre "y-x" consentirà di ottenere un set di elementi presenti in "y" ma non in "x".
Nel caso delle differenze l’operatore di riferimento è quello di sottrazione ("-") utilizzato nel modo seguente:
# Differenza tra set
>>> x_set = {1,2,3,4,5,6}
>>> y_set = {4,5,6,7,8,9}
>>> x_set - y_set
{1, 2, 3}
>>> y_set - x_set
{8, 9, 7}
Il metodo di riferimento è invece difference() che permette di ottenere lo stesso risultato di "-":
# Differenza tra set con difference()
>>> x_set.difference(y_set)
{1, 2, 3}
>>> y_set.difference(x_set)
{8, 9, 7}
Differenze simmetriche tra set
Le differenze simmetriche tra set rappresentano l’operazione contraria rispetto alle semplici differenze: dati due set "x" ed "y", la loro differenza simmetrica" permetterà di generare un set di elementi presenti sia in "x" che "y" escludendo quelli non in comune tra i due.
Per operare una differenza simmetrica si deve utilizzare l’operatore "^" dopo aver definito i due set che fungeranno da operandi:
# Differenza simmetrica tra due set
>>> x_set = {1,2,3,4,5}
>>> y_set = {4,5,6,7,8}
>>> x_set ^ y_set
{1, 2, 3, 7, 8, 9}
Se per le differenze disponiamo del metodo difference() per le differenze simmetriche abbiamo l’operatore symmetric_difference() che permette di ottenere gli stessi risultati di "^" attraverso la seguente sintassi:
# Differenza simmetrica tra set con symmetric_difference()
>>> x_set.symmetric_difference(y_set)
{1, 2, 3, 7, 8, 9}
Frozenset
I frozenset sono un particolare tipo di set, o per meglio dire dei costrutti molto simili ai set, che hanno la caratteristica di non supportare le operazioni di riassegnazione. In sostanza i frozenset sono per i set quello che le tuple rappresentano per le liste. In nessun caso sarà possibile aggiungere o rimuovere un elemento da un frozenset.
Per definire un frozenset si utilizza la funzione frozenset() a cui passare degli elementi attraverso, per esempio, una lista.
# Definzione di frozenset con frozenset()
>>> x_frozenset = frozenset([1, 2, 3, 4, 5])
>>> y_frozenset = frozenset([3, 4, 5, 6, 7])
I frozenset supportano tutte le operazioni per l’insiemistica precedentemente descritte per i set:
# Unione tra frozenset
>>> x_frozenset | y_frozenset
frozenset({1, 2, 3, 4, 5, 6, 7})
# Intersezione tra frozenset
>>> x_frozenset & y_frozenset
frozenset({3, 4, 5})
# Differenza tra frozenset
>>> x_frozenset - y_frozenset
frozenset({1, 2})
# Differenza simmetrica tra frozenset
>>> x_frozenset ^ y_frozenset
frozenset({1, 2, 6, 7})
Per ovvi motivi non sono disponibili metodi per aggiungere o rimuovere elementi dai frozenset:
>>> x_frozenset.add(6)
Traceback (most recent call last):
File "<pyshell#36>", line 1, in <module>
x_frozenset.add(6)
AttributeError: 'frozenset' object has no attribute 'add'
>>> y_frozenset.remove(6)
Traceback (most recent call last):
File "<pyshell#36>", line 1, in <module>
y_frozenset.remove(6)
AttributeError: 'frozenset' object has no attribute 'remove'