In Python, quando usare un dizionario, un elenco o un set?


Risposte:


603

A listmantiene l'ordine dicte setnon farlo: quando ti preoccupi dell'ordine, quindi, devi usarlo list(se la tua scelta di contenitori è limitata a questi tre, ovviamente ;-).

dictassocia ad ogni valore di una chiave, mentre liste setcontengono solo valori: molto diversi casi di utilizzo, ovviamente.

setrichiede che gli oggetti siano hash, listno: se hai oggetti non hash, quindi, non puoi usare sete devi invece usare list.

setvieta i duplicati, listno: anche una distinzione cruciale. (È possibile trovare un "multiset", che mappa i duplicati in un conteggio diverso per gli elementi presenti più di una volta collections.Counter: è possibile crearne uno come dictse, per qualche strano motivo, non è possibile importare collectionso, in pre-2.7 Python come a collections.defaultdict(int), usando gli elementi come chiavi e il valore associato come conteggio).

Il controllo dell'appartenenza di un valore in un set(o dict, per le chiavi) è incredibilmente veloce (richiede un tempo costante e breve), mentre in un elenco ci vuole tempo proporzionale alla lunghezza dell'elenco nel caso medio e peggiore. Quindi, se si dispone di articoli con hash, non preoccuparsi in alcun modo dell'ordine o dei duplicati e si desidera un controllo rapido dell'iscrizione, setè meglio di list.


6
Nota che Python 3.7 è stato ordinato per impostazione predefinita
Gigi Bayte il 2

172
  • Hai solo bisogno di una sequenza ordinata di articoli? Vai per un elenco.
  • Hai solo bisogno di sapere se hai già ottenuto un valore particolare, ma senza ordinare (e non è necessario archiviare i duplicati)? Usa un set.
  • Devi associare i valori alle chiavi, in modo da poterle cercare in modo efficiente (per chiave) in seguito? Usa un dizionario.

30
Questa dovrebbe essere la parte "TL; DR" alla risposta di cui sopra di Alex M. :-)
Alex Boschmans

9
Penso che sia il contrario. Alex dovrebbe donare i suoi voti a Jon. Questa risposta copre praticamente tutto ed è molto più concisa e chiara.
Mehmet,

se, tuttavia, ti piace conoscere la differenza di complessità temporale tra questi tipi di dati, la spiegazione di Alex funziona meglio
kcEmenike

19

Quando si desidera una raccolta non ordinata di elementi unici, utilizzare a set. (Ad esempio, quando si desidera l'insieme di tutte le parole utilizzate in un documento).

Quando si desidera raccogliere un elenco ordinato immutabile di elementi, utilizzare a tuple. (Ad esempio, quando si desidera una coppia (name, phone_number) che si desidera utilizzare come elemento in un set, è necessaria una tupla anziché un elenco poiché i set richiedono elementi immutabili).

Quando si desidera raccogliere un elenco di elementi ordinati mutabili, utilizzare a list. (Ad esempio, quando si desidera aggiungere nuovi numeri di telefono a un elenco: [numero1, numero2, ...]).

Quando si desidera un mapping dalle chiavi ai valori, utilizzare a dict. (Ad esempio, quando si desidera una rubrica telefonica che associ i nomi ai numeri di telefono:) {'John Smith' : '555-1212'}. Nota che i tasti in un dict non sono ordinati. (Se si scorre in un dict (rubrica), i tasti (nomi) possono essere visualizzati in qualsiasi ordine).


Uh, non ha chiesto delle tuple.
habnabit,

18
  • Utilizzare un dizionario quando si dispone di un set di chiavi univoche associate a valori.

  • Utilizzare un elenco se si dispone di una raccolta ordinata di articoli.

  • Utilizzare un set per memorizzare un set di elementi non ordinati.


6

In breve, utilizzare:

list - se hai bisogno di una sequenza ordinata di articoli.

dict - se è necessario correlare i valori con le chiavi

set - se hai bisogno di mantenere elementi unici.

Spiegazione dettagliata

Elenco

Un elenco è una sequenza mutabile, generalmente utilizzata per archiviare raccolte di elementi omogenei.

Un elenco implementa tutte le operazioni di sequenza comuni:

  • x in l e x not in l
  • l[i], l[i:j],l[i:j:k]
  • len(l), min(l),max(l)
  • l.count(x)
  • l.index(x[, i[, j]])- indice della prima occorrenza di xin l(in o dopo ie prima delle jindeci)

Un elenco implementa anche tutte le operazioni di sequenza mutabili:

  • l[i] = x- L'articolo idi lè sostituito dax
  • l[i:j] = t- la sezione di lda ia jviene sostituita dal contenuto dell'iterabilet
  • del l[i:j] - uguale a l[i:j] = []
  • l[i:j:k] = t- gli elementi di l[i:j:k]sono sostituiti da quelli dit
  • del l[i:j:k]- rimuove gli elementi di s[i:j:k]dalla lista
  • l.append(x)- aggiunge xalla fine della sequenza
  • l.clear()- rimuove tutti gli elementi da l(uguale a del l[:])
  • l.copy()- crea una copia superficiale di l(uguale a l[:])
  • l.extend(t)oppure l += t- si estende lcon il contenuto dit
  • l *= n- si aggiorna lcon i suoi contenuti ripetuti nvolte
  • l.insert(i, x)- inserti xin lcorrispondenza dell'indice ini
  • l.pop([i])- recupera l'elemento in ie lo rimuove anche dal
  • l.remove(x)- rimuove il primo elemento da ldove l[i]è uguale a x
  • l.reverse()- inverte gli elementi lin posizione

Un elenco può essere utilizzato come stack sfruttando i metodi appende pop.

Dizionario

Un dizionario associa valori hash a oggetti arbitrari. Un dizionario è un oggetto mutabile. Le operazioni principali su un dizionario sono la memorizzazione di un valore con una chiave e l'estrazione del valore fornito dalla chiave.

In un dizionario, non è possibile utilizzare come valori chiave non hash, ovvero valori contenenti elenchi, dizionari o altri tipi mutabili.

Impostato

Un set è una raccolta non ordinata di oggetti hash distinti. Un set viene comunemente utilizzato per includere test di appartenenza, rimozione di duplicati da una sequenza e calcolo di operazioni matematiche come intersezione, unione, differenza e differenza simmetrica.


5

Non Anche se questo lo fa copertina sets, è una buona spiegazione di dicts e lists:

Gli elenchi sono ciò che sembrano: un elenco di valori. Ognuno di essi è numerato, a partire da zero: il primo è numerato zero, il secondo 1, il terzo 2, ecc. È possibile rimuovere i valori dall'elenco e aggiungere nuovi valori alla fine. Esempio: i nomi dei tuoi molti gatti.

I dizionari sono simili a ciò che suggerisce il loro nome: un dizionario. In un dizionario, hai un 'indice' di parole e per ognuna una definizione. In Python, la parola è chiamata "chiave" e la definizione un "valore". I valori in un dizionario non sono numerati - tara simile a ciò che suggerisce il loro nome - un dizionario. In un dizionario, hai un 'indice' di parole e per ognuna una definizione. I valori in un dizionario non sono numerati - non sono in alcun ordine specifico - la chiave fa la stessa cosa. È possibile aggiungere, rimuovere e modificare i valori nei dizionari. Esempio: rubrica telefonica.

http://www.sthurlow.com/python/lesson06/


4

Per C ++ avevo sempre in mente questo diagramma di flusso: in quale scenario uso un contenitore STL particolare? , quindi ero curioso di sapere se qualcosa di simile è disponibile anche per Python3, ma non ho avuto fortuna.

Quello che devi tenere a mente per Python è: Non esiste un singolo standard Python come per C ++. Quindi potrebbero esserci enormi differenze per i diversi interpreti Python (ad esempio CPython, PyPy). Il seguente diagramma di flusso è per CPython.

Inoltre ho trovato nessun buon modo per incorporare le seguenti strutture di dati nel diagramma: bytes, byte arrays, tuples, named_tuples, ChainMap, Counter, e arrays.

  • OrderedDicte dequesono disponibili tramite collectionsmodulo.
  • heapqè disponibile dal heapqmodulo
  • LifoQueue, Queuee PriorityQueuesono disponibili tramite il queuemodulo progettato per l'accesso simultaneo (thread). (C'è anche un multiprocessing.Queuedisponibile ma non conosco le differenze queue.Queuema presumo che dovrebbe essere usato quando è necessario l'accesso simultaneo dai processi.)
  • dict, set, frozen_set, E listsono ovviamente incorporato

Per chiunque sarei grato se potessi migliorare questa risposta e fornire un diagramma migliore in ogni aspetto. Sentiti libero e benvenuto. diagramma di flusso

PS: il diagramma è stato realizzato con yed. Il file graphml è qui


3

In combinazione con liste , dadi e set , ci sono anche altri interessanti oggetti Python, OrderedDicts .

I dizionari ordinati sono esattamente come i dizionari normali ma ricordano l'ordine in cui gli articoli sono stati inseriti. Quando si scorre su un dizionario ordinato, gli articoli vengono restituiti nell'ordine in cui le loro chiavi sono state aggiunte per la prima volta.

OrderedDicts potrebbe essere utile quando è necessario preservare l'ordine delle chiavi, ad esempio lavorando con i documenti: è comune avere bisogno della rappresentazione vettoriale di tutti i termini in un documento. Quindi, usando OrderedDicts è possibile verificare in modo efficace se un termine è stato letto prima, aggiungere termini, estrarre termini e dopo tutte le manipolazioni è possibile estrarre la rappresentazione vettoriale ordinata di essi.


1

Gli elenchi sono come sembrano: un elenco di valori. Ognuno di essi è numerato, a partire da zero: il primo è numerato zero, il secondo 1, il terzo 2, ecc. È possibile rimuovere i valori dall'elenco e aggiungere nuovi valori alla fine. Esempio: i nomi dei tuoi molti gatti.

Le tuple sono proprio come gli elenchi, ma non puoi modificarne i valori. I valori che date per primi, sono i valori con cui siete bloccati per il resto del programma. Ancora una volta, ogni valore è numerato a partire da zero, per un facile riferimento. Esempio: i nomi dei mesi dell'anno.

I dizionari sono simili a ciò che suggerisce il loro nome: un dizionario. In un dizionario, hai un 'indice' di parole e per ognuna una definizione. In Python, la parola è chiamata "chiave" e la definizione un "valore". I valori in un dizionario non sono numerati - tara simile a ciò che suggerisce il loro nome - un dizionario. In un dizionario, hai un 'indice' di parole e per ognuna una definizione. In Python, la parola è chiamata "chiave" e la definizione un "valore". I valori in un dizionario non sono numerati - non sono in alcun ordine specifico - la chiave fa la stessa cosa. È possibile aggiungere, rimuovere e modificare i valori nei dizionari. Esempio: rubrica telefonica.


1

Quando li uso, creo un cheat sheet esaustivo dei loro metodi come riferimento:

class ContainerMethods:
    def __init__(self):
        self.list_methods_11 = {
                    'Add':{'append','extend','insert'},
                    'Subtract':{'pop','remove'},
                    'Sort':{'reverse', 'sort'},
                    'Search':{'count', 'index'},
                    'Entire':{'clear','copy'},
                            }
        self.tuple_methods_2 = {'Search':'count','index'}

        self.dict_methods_11 = {
                    'Views':{'keys', 'values', 'items'},
                    'Add':{'update'},
                    'Subtract':{'pop', 'popitem',},
                    'Extract':{'get','setdefault',},
                    'Entire':{ 'clear', 'copy','fromkeys'},
                            }
        self.set_methods_17 ={
                    'Add':{['add', 'update'],['difference_update','symmetric_difference_update','intersection_update']},
                    'Subtract':{'pop', 'remove','discard'},
                    'Relation':{'isdisjoint', 'issubset', 'issuperset'},
                    'operation':{'union' 'intersection','difference', 'symmetric_difference'}
                    'Entire':{'clear', 'copy'}}

1

Dizionario: un dizionario Python viene utilizzato come una tabella hash con chiave come indice e oggetto come valore.

Elenco: un elenco viene utilizzato per contenere oggetti in un array indicizzato dalla posizione di tale oggetto nell'array.

Set: un set è una raccolta con funzioni che possono dire se un oggetto è presente o meno nel set.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.