2014-07-17 17 views
7

Ho scritto il seguente codice in due modi diversi. Sto cercando di trovare il modo corretto di farlo in modo pititico. Spiegherò le ragioni di entrambi.Modo corretto per modificare il valore del dizionario python

Primo modo, EAFP. Questo usa il principio del pitone EAFP, ma causa una certa duplicazione del codice.

try: 
    my_dict['foo']['bar'] = some_var 
except KeyError: 
    my_dict['foo'] = {} 
    my_dict['foo']['bar'] = some_var 

Secondo modo, LBYL. LBYL non è esattamente considerato pitone, ma rimuove la duplicazione del codice.

if 'foo' not in my_dict: 
    my_dict['foo'] = {} 

my_dict['foo']['bar'] = some_var 

Quale modo sarebbe considerato migliore? O c'è un modo migliore?

+0

Vorrei utilizzare il secondo modo. Il codice ripetuto non è bello. Quindi se 'bar' diventa' pippo', devi cambiarlo una volta. – cdonts

risposta

8

direi uno sviluppatore Python esperto sarebbe usare sia

dict.setdefault o collections.defaultdict

my_dict.setdefault('foo', {})['bar'] = some_var 

o

from collection import defaultdict 
my_dict = defaultdict(dict) 
my_dict['foo']['bar'] = some_var 

Anche per ragioni di completezza, io vi introdurrà ad un ricorsiva defaultdict modello, che permette di dizionari con profondità infinita senza alcun errore chiave

>>> from collections import defaultdict 
>>> def tree(): return defaultdict(tree) 

>>> my_dict = tree() 
>>> my_dict['foo']['bar']['spam']['egg'] = 0 
>>> my_dict 
defaultdict(<function tree at 0x026FFDB0>, {'foo': defaultdict(<function tree at 0x026FFDB0>, {'bar': defaultdict(<function tree at 0x026FFDB0>, {'spam': defaultdict(<function tree at 0x026FFDB0>, {'egg': 0})})})}) 
+0

Mi piacciono le opzioni. Fornendomi entrambe le soluzioni, posso scegliere come funziona meglio nel mio caso. (in questo caso non posso usare defaultdict perché il dizionario mi è stato dato) –

0

Il secondo modo è più pitonioso perché non genera un errore dove si sa che si potrebbe verificare e potrebbe facilmente prevenirlo.

+0

Anche il primo non "lancia un errore". –

+0

Genera un'eccezione gestita dal blocco eccetto. – Michael

+0

Non sono d'accordo, il try-except di solito è più appropriato secondo pep8 –

2

Soluzione migliore:

my_dict.setdefault('foo', {})['bar'] = some_var 

provare a guardare le dizionario Python ottenere e setDefault metodi.

3

Utilizzare un defaultdict

#!/usr/bin/env python               

from collections import defaultdict            

my_dict = defaultdict(dict)              

my_dict['foo']['bar'] = "Hello, defaultdict"          

print my_dict['foo']['bar'] 
Problemi correlati