Quando utilizzare un dizionario vs tupla in Python

28

L'esempio specifico in mente è una lista di nomi di file e le loro dimensioni. Non riesco a decidere se ciascun elemento nell'elenco deve essere del formato {"filename": "blabla", "size": 123} o solo ("blabla", 123) . Un dizionario mi sembra più logico perché per accedere alla dimensione, ad esempio, file["size"] è più esplicativo di file[1] ... ma non lo so per certo. Pensieri?

    
posta clb 19.11.2017 - 17:07
fonte

5 risposte

74

Vorrei usare namedtuple :

from collections import namedtuple
Filesize = namedtuple('Filesize', 'filename size')
file = Filesize(filename="blabla", size=123)

Ora puoi usare file.size e file.filename nel tuo programma, che è IMHO la forma più leggibile. Nota namedtuple crea oggetti immutabili come le tuple e sono più leggeri dei dizionari, come descritto qui .

    
risposta data 19.11.2017 - 18:36
fonte
17

{"filename": "blabla", "size": 123}, or just ("blabla", 123)

Questa è la vecchia questione di codificare il tuo formato / schema in-band o out-of-band.

Scambia un po 'di memoria per ottenere la leggibilità e la portabilità che deriva dall'esprimere il formato dei dati direttamente nei dati. Se non lo fai, sappi che il primo campo è il nome del file e il secondo è che la dimensione deve essere mantenuta altrove. Ciò risparmia memoria ma costa leggibilità e portabilità. Quale sarà il costo della tua azienda più denaro?

Per quanto riguarda il problema immutabile, ricordare immutabile non significa inutile di fronte al cambiamento. Significa che dobbiamo prendere più memoria, apportare la modifica in una copia e usare la nuova copia. Questo non è gratuito ma spesso non è un affare. Usiamo stringhe immutabili per cambiare le cose continuamente.

Un'altra considerazione è l'estensibilità. Quando si archiviano i dati solo in modo posizionale, senza le informazioni sul formato di codifica, si viene condannati a un'unica ereditarietà, che in realtà non è altro che la pratica di concatenare campi aggiuntivi dopo i campi stabiliti. Posso definire un terzo campo come data di creazione ed essere comunque compatibile con il tuo formato poiché definisco prima e secondo allo stesso modo.

Tuttavia, ciò che non posso fare è riunire due formati definiti in modo indipendente che hanno alcuni campi sovrapposti, altri no, li memorizzano in un formato e sono utili a cose che conoscono solo uno o l'altro formato.

Per farlo ho bisogno di codificare le informazioni sul formato dall'inizio. Devo dire "questo campo è il nome del file". Ciò consente l'ereditarietà multipla.

Probabilmente sei abituato all'ereditarietà espressa solo nel contesto degli oggetti, ma le stesse idee funzionano per i formati dei dati perché, beh, gli oggetti sono archiviati in formati di dati. È esattamente lo stesso problema.

Quindi usa quello che pensi che sia più probabile che tu abbia bisogno. Raggiungo la flessibilità a meno che non riesca a indicare una buona ragione per non farlo.

    
risposta data 19.11.2017 - 18:37
fonte
6

Vorrei usare una classe con due proprietà. file.size è più bello di file[1] o file["size"] .

Semplice è meglio che complesso.

    
risposta data 19.11.2017 - 18:05
fonte
5

I nomi dei file sono univoci? In tal caso, è possibile eliminare completamente l'elenco e utilizzare solo un dizionario puro per tutti i file. per esempio. (un sito Web ipotetico)

{ 
  "/index.html" : 5467,
  "/about.html" : 3425,
  "/css/main.css" : 9876
}

ecc ...

Ora, non ottieni "nome" e "dimensione", usi solo la chiave e il valore, ma spesso è più naturale. YMMV.

Se veramente vuoi una "dimensione" per chiarezza, o hai bisogno di più di un valore per il file, allora:

{ 
   "/index.html" : { "size": 5467, "mime_type" : "foo" },
   "/about.html" : { "size": 3425, "mime_type" : "foo" }
   "/css/main.css" : { "size": 9876, "mime_type" : "bar" }
}
    
risposta data 19.11.2017 - 19:48
fonte
0

In python, il dizionario è un oggetto mutabile. Altra parte, la tupla è un oggetto immutabile.

se è necessario modificare la chiave del dizionario, la coppia di valori spesso o ogni volta. suggerisco un dizionario da usare.

se hai dati fissi / statici, suggerisco tuple da usare.

# dictionary define.
a = {}
a['test'] = 'first value'

# tuple define.
b = ()
b = b+(1,)

# here, we can change dictionary value for key 'test'
a['test'] = 'second'

Tuttavia, non è possibile modificare i dati della tupla usando l'operatore di assegnazione.

    
risposta data 19.11.2017 - 17:42
fonte

Leggi altre domande sui tag