back to top

I set in Python

I set sono delle entità simili alle liste e alle tuple, essi sono definibili come delle raccolte non ordinate di elementi in cui ciascuno di essi è unico e immutabile. In sostanza un set è composto da elementi non duplicati che non possono essere modificati, è invece possibile modificare i set, per esempio aggiungendo o rimuovendo elementi.

Definire un set

La sintassi dei set prevede che questi vengano definiti attribuendo loro un nome e associando ad essi degli elementi che dovranno essere indicati tra parantesi graffe nonché separati da virgole:

# Definizione di un set
>>> mome_set = {'a','b','c'}

Si potranno definire set composti da elementi di tipo stringa così come set composti da elementi di tipo numerico o formati da elementi associati a diversi tipi di dato; l’esempio seguente mostra la definizione di un set in cui sono presenti due stringhe, un intero e una tupla formata da interi:

# Definizione di un set composto
# da elementi di tipo di dato differente
>>> nome_set = {'homer',120,'lisa',(3,5,6))}

Se è possibile utilizzare una tupla come elemento di un set lo stesso non potrà essere fatto con una lista, questo perché le liste contengono elementi modificabili; il tentativo di definire un set contenente una lista porterà alla generazione di un errore:

# Errore generato dall'utilizzo di elementi
>>> # modificabili in un set
>>> nome_set = {'homer',120,'lisa',[3,5,6]}
Traceback (most recent call last):
  File "<pyshell#17>", line 1, in <module>
    nome_set = {'homer',120,'lisa',[3,5,6]}
TypeError: unhashable type: 'list'

Nel caso in cui invece si tenti di inserire nel set un elemento duplicato, questo verrà semplicemente reso unico dall’engine di Python che si occuperà di rimuovere dal set i doppioni.

# Rimozione automatica dei doppioni da un set
>>> nome_set = {'homer',120,'lisa','homer',(3,5,6)}
>>> nome_set
{120, (3, 5, 6), 'homer', 'lisa'}

Definire set con set()

La funzione nativa set() offre una modalità alternativa per la definizione dei set, essa infatti consente di creare set accettando come argomenti gli elementi che ne faranno parte; questi ultimi però dovranno essere passati alla funzione sotto forma di un unico elemento iterabile come per esempio una tupla, questo perché set() ammette un solo parametro alla volta:

# Definire un set con set() da una tupla
>>> nome_set = set((1,2,3,9,5))
>>> nome_set
{1, 2, 3, 9, 5}

Uno dei vantaggi derivanti dall’utilizzo di set() sta nel fatto che essa permette di creare un set anche a partire da un parametro iterabile modificabile come per esempio una lista:

# Definire un set con set() da una lista
>>> nome_set = set([1,2,3,9,5])
>>> nome_set
{1, 2, 3, 9, 5}

Chiaramente, una volta entrati a far parte del set gli elementi della lista diventeranno immutabili.

set() è inoltre utilizzabile per la creazione di set vuoti da popolare eventualmente in un momento successivo:

# Crazione di un set vuoto con set()
>>> nome_set = set()

E’ importante tenere presente che set() interpreta l’argomento che gli viene passato come un gruppo di elementi, questo vuol dire che una stringa composta da più caratteri verrà suddivisa per tutti gli elementi che la compongono:

>>>nome_set = set('homer')
>>> nome_set
{'o', 'h', 'r', 'm', 'e'}

Inserimento di nuovi elementi in un set

Come anticipato, i set sono delle raccolte "non ordinate", questo significa che a differenza delle liste e delle tuple i loro elementi non vengono indicizzati e non sarà possibile utilizzare un numero indice per richiamarli; sostanzialmente una sintassi come la seguente, valida per le liste e le tuple, non ha alcun senso per i set:

# Definizione di un set
>>> nome_set = {2,4,6,8}
# Tentativo di accesso ad un elemento di un set 
# attraverso un indice
>>> nome_set[1]
Traceback (most recent call last):
  File "<pyshell#35>", line 1, in <module>
    nome_set[1]
TypeError: 'set' object does not support indexing

Se si desidera aggiungere un nuovo elemento ad un set è possibile farlo tramite il metodo add():

# Aggiungere un elemento ad un set 
>>> nome_set = {100,300,400}
>>> nome_set
{400, 300, 100}
>>> nome_set.add(200)
>>> nome_set
{400, 200, 300, 100}

add() permette però di aggiungere un solo elemento alla volta in un set, per l’aggiunta di più elementi bisogna invece ricorrere al metodo update() che consentirà il nuovo inserimento tramite tuple, liste o altre raccolte di elementi:

# Aggiungere più elementi ad un set
>>> nome_set.update([500,600,700])
>>> nome_set
{7, 8, 9, 500, 600, 700}

update() è utilizzabile anche per l’inserimento di set all’interno di altri set, come nell’esempio seguente dove al set originali vengono aggiunte una lista e un set:

>>> nome_set.update([800,900], {1000,2000,3000})
>>> nome_set
{800, 900, 7, 8, 9, 1000, 2000, 500, 600, 3000, 700}

Rimuovere elementi da un set

Python dispone di diversi metodi per la rimozione di elementi dai set, uno di questi è discard() al quale basterà passare come parametro l’elemento da rimuovere:

# Rimozione di un elemento da un set con discard() 
>>> nome_set = {'c','i','a','o'}
>>> nome_set.discard('i')
>>> nome_set
{'o', 'c', 'a'}

In alternativa sarà possibile utilizzare il metodo remove():

# Rimozione di un elemento da un set con remove() 
>>> nome_set.remove('c')
>>> nome_set
{'o', 'a'}

discard() e remove() si differenziano per il fatto che il secondo genera un errore nel caso in cui l’elemento che si tenta di eliminare non sia presente nel set, il primo invece lascia semplicemente la situazione immutata.

Particolare il caso del metodo pop() che quando richiamato rimuove un quasiasi elemento del set scelto arbitrariamente dallo stesso inteprete di Python, senza che l’utilizzatore possa prevedere o decidere quale debba essere:

# Rimozione di un elemento da un set con pop() 
>>> nome_set = {'c','i','a','o'}
>>> nome_set.pop()
'o'
>>> nome_set
{'i', 'c', 'a'}

Infine, per ripulire completamente un set dai suoi elementi si utilizza il metodo clear():

# Rimozione di tutti gli elementi di un set 
>>> nome_set.clear()
>>> nome_set
set()
Pubblicitร 
Claudio Garau
Claudio Garau
Web developer, programmatore, Database Administrator, Linux Admin, docente e copywriter specializzato in contenuti sulle tecnologie orientate a Web, mobile, Cybersecurity e Digital Marketing per sviluppatori, PA e imprese.
Articolo precedente
Articolo successivo