Storia della questione:
Il tipo set (insieme) è stato aggiunto in Python 2.4 e fornisce un modo comodo e veloce per memorizzare elementi unici immutabili con supporto per operazioni di teoria degli insiemi (unione, intersezione, ecc.). Gli insiemi sono implementati su base di tabelle hash.
Problema: Molti utenti non comprendono la differenza tra set e list, le caratteristiche di archiviazione degli elementi in set (non ordinati, solo oggetti hashable), così come i dettagli dell'uso degli insiemi per ottimizzare la ricerca, il controllo dell'unicità o l'elaborazione di grandi dataset.
Soluzione:
Il set è un contenitore mutabile e non ordinato di oggetti unici hashable. Supporta operazioni veloci di appartenenza, unione, intersezione, differenza e differenza simmetrica. Metodi incorporati: add, remove, discard, update, intersection, difference, union, symmetric_difference e altri.
Esempio di codice:
nums = {1, 3, 5, 7} nums.add(9) nums.update([5, 10]) # 5 è già presente, solo 10 verrà aggiunto other = {3, 9, 11} inter = nums & other # intersezione {3, 9} # Verifica di appartenenza — più veloce di list y = 11 if y in nums: print('C'è!')
Caratteristiche chiave:
in è incredibilmente veloce (O(1) in media), a differenza della lista (O(n)).È possibile aggiungere una lista o un altro set in un set?
Risposta: No, non è possibile. Solo oggetti hashable (immutabili) sono consentiti: stringhe, numeri, tuple. Liste e insiemi sono mutabili e non possono essere aggiunti.
Esempio di codice:
s = set() s.add([1, 2]) # TypeError: tipo non hashable: 'list' s.add((1, 2)) # OK
Qual è la differenza tra il metodo remove e discard in un set?
Risposta: remove(value) solleva un'eccezione KeyError se il valore non viene trovato. discard(value) non fa nulla in silenzio se tale elemento non esiste.
Esempio di codice:
s = {1, 2, 3} s.remove(4) # KeyError s.discard(4) # Nessun errore
Un insieme vuoto {} è un oggetto set?
Risposta: No. Il letterale {} è sempre un dict vuoto. Per creare un set vuoto è necessario utilizzare la funzione set().
Esempio di codice:
empty_set = {} # Questo è un dict empty_set_real = set() # Questo è un set
Caso negativo
Cercano di memorizzare oggetti unici in una lista e fanno controllo tramite "in" per cercare duplicati con grandi volumi di dati.
Vantaggi:
Svantaggi:
Caso positivo
Usano set per cercare intersezioni e dati unici in grandi array (ad esempio, email di mailing), senza che si verifichino duplicati e l'operazione avviene rapidamente.
Vantaggi:
Svantaggi: