2.3.7 Tipi set

Un oggetto set (NdT: insieme) è una collezione non ordinata di valori immutabili. Gli usi comuni includono l'esame dei membri dell'insieme, la rimozione dei duplicati da una sequenza, e la computazione di operazioni matematiche quali intersezione, unione, differenza, e differenza simmetrica. Nuovo nella versione 2.4.

Come altre collezioni, gli insiemi supportano x in set, len(set) e for x in set. Essendo collezioni non ordinate, gli insiemi non registrano la posizione degli elementi o l'ordine di inserzione. Di conseguenza, gli insiemi non supportano l'indicizzazione, l'affettamento o altri comportamenti tipici delle sequenze.

Esistono correntemente due tipi di insiemi built-in, set e frozenset. Il tipo set è mutabile -- il contenuto può essere cambiato usando metodi come add() e remove(). Poiché è mutabile, non ha un valore hash e non può venire usato come una chiave di dizionario o un elemento di un altro insieme. Il tipo frozenset è immutabile e supporta l'hash -- il suo contenuto non può venire alterato dopo la creazione; tuttavia, può venire usato come una chiave di dizionario o come un elemento di un altro insieme.

Le istanze di set e frozenset forniscono le seguenti operazioni:

Operazione  Equivalenza  Risultato 
len(s)   cardinalità dell'insieme s
x in s   verifica x come membro di s
x not in s   verifica che x non sia un membro di s
s.issubset(t) s <= t verifica se ogni elemento in s è in t
s.issuperset(t) s >= t verifica se ogni elemento in t è in s
s.union(t) s | t nuovo insieme con elementi sia di s che di t
s.intersection(t) s & t nuovo insieme con elementi comuni tra s e t
s.difference(t) s - t nuovo insieme con elementi in s ma non in t
s.symmetric_difference(t) s ^ t nuovo insieme con gli elementi di s o t ma non entrambi
s.copy()   nuovo insieme, una copia superficiale di s

Notate, le versioni dei metodi non operatori di union(), intersection(), difference(), symmetric_difference(), issubset() e issuperset() accetteranno ogni iterabile come argomento. Invece i loro operatori base controparte richiedono che i propri argomenti debbano essere insiemi. Questo preclude errori di costruzione come set('abc') & 'cbs' in favore di un più leggibile set('abc').intersection('cbs').

set e frozenset supportano il confronto tra insiemi. Due insiemi sono uguali se e solo se ogni elemento di ogni insieme è contenuto nell'altro (ognuno è un sotto insieme dell'altro). Un insieme è minore dell'altro insieme se e solo se il primo insieme è un insieme di proprietà del secondo insieme (è un sotto insieme ma non è uguale). Un insieme è più grande di un altro insieme se e solo se il primo insieme è un superinsieme proprietario del secondo insieme (è un superinsieme, ma non è uguale).

Il sotto insieme ed il confronto di uguaglianza non generalizzano ad una funzione di ordinamento completa. Per esempio, ogni due insiemi disgiunti sono non uguali e non sono sottoinsiemi uno dell'altro, così tutte le seguenti uguaglianze restituiscono False: a<b, a==b o a>b. Di conseguenza, gli insiemi non implementano il metodo __cmp__.

Poichè gli insiemi definiscono solo parzialmente l'ordinamento (relazioni tra sottoinsiemi), l'output del metodo list.sort() risulta indefinito per le liste di insiemi.

Per convenienza nell'implementazione di insiemi di insiemi, i metodi __contains__(), remove() e discard() automaticamente cercano corrispondenze con istanze della classe set e le loro controparti frozenset, all'interno di un insieme. Per esempio, set('abc') in set([frozenset('abc')])) restituisce True.

La seguente tabella elenca le operazioni disponibili per classi set che non applicano l'istanza immutabile di frozenset:

Operazione  Equivalenza  Risultato 
s.update(t) s |= t restituisce l'insieme s con elementi aggiunti da t
s.intersection_update(t) s &= t restituisce l'insieme s dei soli valori comuni riscontrati anche in t
s.difference_update(t) s -= t restituisce l'insieme s dopo la rimozione degli elementi comuni riscontrati in t
s.symmetric_difference_update(t) s ^= t restituisce l'insieme s con elementi da s o t ma non da entrambi
s.add(x)   aggiunge l'elemento x all'insieme s
s.remove(x)   rimuove x dall'insieme s; solleva l'eccezione KeyError se non presente
s.discard(x)   rimuove x dall'insieme s se presente
s.pop()   rimuove e restituisce un elemento arbitrario da s; solleva l'eccezione KeyError se non presente
s.clear()   rimuove tutti gli elementi dall'insieme s

Notate, le versioni non operatore dei metodi update(), intersection_update(), difference_update() e symmetric_difference_update() accetteranno ogni iterabile come un argomento.

Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.