2014-05-05 18 views
8

Con un semplice dizionario come:Come ottenere annidato dizionario valore della chiave con .get()

myDict{'key1':1, 'key2':2} 

posso utilizzare in modo sicuro:

print myDict.get('key3') 

e perfino mentre 'key3' non è esistente non gli errori verranno lanciati poiché .get() restituisce ancora Nessuno.

Ora come vorrei ottenere la stessa semplicità con chiavi nidificato dizionario:

myDict={} 
myDict['key1'] = {'attr1':1,'attr2':2} 

Di seguito vi darà un KeyError:

print myDict.get('key1')['attr3'] 

Questo passerà attraverso:

print myDict.get('key1').get('attr3') 

ma fallirà con adn AttributeError: l'oggetto 'NoneType' non ha attributo 'get':

print myDict.get('key3').get('attr1') 

risposta

16

dict.get accetta ulteriore parametro default. Il value viene restituito invece di None se non esiste una chiave di questo tipo.

print myDict.get('key1', {}).get('attr3') 
+0

Grazie! Buono a sapersi! – alphanumeric

1

utilizzare le eccezioni:

try: 
    print myDict['key1']['attr3'] 
except KeyError: 
    print "Can't find my keys" 
+1

D'accordo, ma le eccezioni aggiungono molte linee extra ... – alphanumeric

+0

Ora, perché diavolo non ci avrei pensato?!? –

0

Questo è normale in quanto key3 non esiste così

myDict.get('key3') 

rendimenti nessuno ..

oggetto NoneType non ha alcun attributo ..

Quindi devi memorizzare il valore di myDict.get ('key3'), verifica se non è nullo e usa il metodo get sull'elemento memorizzato

3

C'è un bel blog post from Dan O'Huiginn sull'argomento dei dizionari nidificati. Alla fine suggerisce la sottoclasse di dettare con una classe che gestisce meglio la nidificazione. Ecco la sottoclasse modificato per gestire il vostro caso cercando di chiavi di accesso di valori non dict:

class ndict(dict): 
    def __getitem__(self, key): 
     if key in self: return self.get(key) 
     return self.setdefault(key, ndict()) 

È possibile fare riferimento le chiavi attuali nidificati o quelli che non esistono. È possibile utilizzare tranquillamente la notazione della parentesi per l'accesso anziché .get(). Se una chiave non esiste su un oggetto NestedDict, si otterrà un oggetto NestedDict vuoto. L'inizializzazione è un po 'prolissa, ma se hai bisogno della funzionalità, potrebbe funzionare per te. Ecco alcuni esempi:

In [97]: x = ndict({'key1': ndict({'attr1':1, 'attr2':2})}) 

In [98]: x 
Out[98]: {'key1': {'attr1': 1, 'attr2': 2}} 

In [99]: x['key1'] 
Out[99]: {'attr1': 1, 'attr2': 2} 

In [100]: x['key1']['key2'] 
Out[100]: {} 

In [101]: x['key2']['key2'] 
Out[101]: {} 

In [102]: x['key1']['attr1'] 
Out[102]: 1 
Problemi correlati