2012-05-01 15 views
11

Soy nuevo en Python y necesitan ayuda para resolver un problema:valor de Acceso dentro de los diccionarios anidados

tengo un diccionario como

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

¿tenemos alguna otra forma de acceder valor de TRES distinta de hacer

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

?

+3

¿Qué quieres hacer? – dav1d

+0

¿Por qué tienes un diccionario así para empezar? ¿Qué cantidad de datos hay en cada nivel que también desea una forma fácil de acceder? – geoffspear

+3

¿Por qué no quieres hacer 'tmpDict ['ONE'] ['TWO'] ['TRREE']'? –

Respuesta

3

Puede usar el get() en cada dict. Asegúrese de haber agregado la verificación None para cada acceso.

+0

.get no está hecho para verificar después si el valor devuelto es 'Ninguno', también puede comprobar si la clave está en el diccionario:' clave en dict' o para versiones anteriores 'dict.has_key' – dav1d

+4

' tmpDict.get ('ONE', {}). Get ('TWO', {}). Get ('TRREE') 'usando get con dict vacío como predeterminado ... si alguna de las tres claves no existe, devuelve 'Ninguno' – akhyar

1

No, esos son diccionarios anidados, así que esa es la única manera real (puede usar get() pero es lo mismo en esencia). No obstante, hay una alternativa. En lugar de tener diccionarios anidados, se puede usar una tupla como una clave en su lugar:

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

Esto tiene una desventaja, no hay manera (fácil y rápido) de conseguir todos los elementos de "TWO" por ejemplo, pero si eso no importa, esta podría ser una buena solución.

+3

No tengo muy claro cómo esto sería beneficioso en cualquier aplicación práctica. Si sus datos están estructurados, aplanarlos y aumentar la complejidad de las claves realmente no parece agregar valor. –

+2

@ sr2222 Significa que no tiene que tener una gran cantidad de dicts, significa que no tiene que preocuparse de crear los diccionarios al agregar nuevos valores, y podría ser más natural dependiendo de la aplicación. Creo que es suficiente para que valga la pena en algunas situaciones. –

19

Como siempre en python, hay, por supuesto, varias formas de hacerlo, pero hay una forma obvia de hacerlo.

tmpdict["ONE"]["TWO"]["THREE"]es la forma obvia de hacerlo.

Cuando eso no encaja bien con su algoritmo, puede ser una indicación de que su estructura no es la mejor para el problema.

Si lo que desea es sólo te ahorra tener que escribir repetitiva, se puede, por alias supuesto, un subconjunto de los 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

Mi aplicación:

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:]) 

Ejemplo de uso:

>>> 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") 
>>> 

No hay excepciones planteadas en caso de que falte una clave, no se devuelve ningún valor en ese caso.

Cuestiones relacionadas