2012-05-01 12 views
11

Sono nuovo di pitone e hanno bisogno di aiuto per risolvere un problema:valore Accesso all'interno dizionari nidificati

Ho un dizionario come

tmpDict = {'ONE':{'TWO':{'THREE':10}}} 

fare: abbiamo un altro modo per accedere al valore di tre di diverso da fare

tmpDict['ONE']['TWO']['THREE'] 

?

+3

cosa vuoi fare? – dav1d

+0

Perché hai un dizionario come quello per cominciare? Quanti altri dati sono a ogni livello a cui vuoi anche accedere facilmente? – geoffspear

+3

Perché non vuoi fare 'tmpDict ['ONE'] ['TWO'] ['THREE']'? –

risposta

3

È possibile utilizzare get() su ciascun dett. Assicurarsi di aver aggiunto il controllo Nessuno per ogni accesso.

+0

.get non viene creato per il controllo successivo se il valore restituito è 'Nessuno', è anche possibile controllare se la chiave è nel dizionario:' chiave in dict' o per versioni precedenti 'dict.has_key' – dav1d

+4

' tmpDict.get ('UNO', {}). Get ('TWO', {}). Get ('THREE') 'usando get con dict vuoto come predefinito ... se nessuna delle tre chiavi non esiste, sarà restituisce 'Nessuno' – akhyar

1

No, quelli sono dizionari nidificati, quindi questo è l'unico modo reale (è possibile utilizzare get() ma è la stessa cosa in sostanza). Tuttavia, c'è un'alternativa. Invece di avere dizionari nidificate, è possibile utilizzare una tupla come una chiave, invece:

tempDict = {("ONE", "TWO", "THREE"): 10} 
tempDict["ONE", "TWO", "THREE"] 

questo ha uno svantaggio, non esiste un modo (facile e veloce) di ottenere tutti gli elementi di "TWO" per esempio, ma se questo non importa, questa potrebbe essere una buona soluzione.

+3

Non sono abbastanza chiaro su come ciò sarebbe vantaggioso in qualsiasi applicazione pratica. Se i tuoi dati sono strutturati, l'appiattimento e l'aumento della complessità chiave non sembrano davvero aggiungere valore. –

+2

@ sr2222 Significa che non è necessario disporre di un numero elevato di dicts, significa che non devi preoccuparti di creare i dizionari secondari quando aggiungi nuovi valori, e potrebbe essere più naturale a seconda dell'applicazione. Penso che sia abbastanza per essere utile in alcune situazioni. –

19

Come sempre in Python, ci sono naturalmente diversi modi per farlo, ma c'è un modo ovvio per farlo.

tmpdict["ONE"]["TWO"]["THREE"]è il modo più ovvio per farlo.

Quando ciò non si adatta bene all'algoritmo, potrebbe essere un suggerimento che la struttura non è la migliore per il problema.

Se si vuole solo solo risparmiare digitazione ripetitivo, potete naturalmente alias un sottoinsieme dei dict:

>>> two_dict = tmpdict['ONE']['TWO'] # now you can just write two_dict for tmpdict['ONE']['TWO'] 
>>> two_dict["spam"] = 23 
>>> tmpdict 
{'ONE': {'TWO': {'THREE': 10, 'spam': 23}}} 
1

mia realizzazione:

def get_nested(data, *args): 
    if args and data: 
     element = args[0] 
     if element: 
      value = data.get(element) 
      return value if len(args) == 1 else get_nested(value, *args[1:]) 

Esempio di utilizzo:

>>> dct={"foo":{"bar":{"one":1, "two":2}, "misc":[1,2,3]}, "foo2":123} 
>>> get_nested(dct, "foo", "bar", "one") 
1 
>>> get_nested(dct, "foo", "bar", "two") 
2 
>>> get_nested(dct, "foo", "misc") 
[1, 2, 3] 
>>> get_nested(dct, "foo", "missing") 
>>> 

Non ci sono eccezioni sollevate nel caso in cui manchi una chiave, in questo caso viene restituito alcun valore.

Problemi correlati