Acceso a valor dentro de diccionarios nesteds

Soy nuevo en Python y necesito ayuda para resolver un problema:

Tengo un diccionario como

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

¿Tenemos otra forma de acceder al valor de TRES aparte de hacerlo?

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

?

Puedes usar el get () en cada dict. Asegúrese de haber agregado la comprobación Ninguno para cada acceso.

Como siempre en Python, hay, por supuesto, varias formas de hacerlo, pero hay una manera obvia de hacerlo.

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

Cuando eso no encaja bien con su algoritmo, puede ser un indicio de que su estructura no es la mejor para el problema.

Si solo desea guardar su escritura repetitiva, puede, por supuesto, alias un subconjunto del 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}}} 

Mi implementació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 en caso de que falte una clave, en ese caso no se devuelve ningún valor.

La respuesta ya fue dada por Sivasubtwigniam Arunachalam o ch3ka.

Solo estoy agregando una vista de las actuaciones de la respuesta.

 dicttest={} dicttest['ligne1']={'ligne1.1':'test','ligne1.2':'test8'} %timeit dicttest['ligne1']['ligne1.1'] %timeit dicttest.get('ligne1').get('ligne1.1') 

Nos da :

112 ns ± 29.7 ns por bucle (media ± desviación estándar de 7 ejecuciones, 10000000 bucles cada una)

235 ns ± 9.82 ns por bucle (media ± desviación estándar de 7 carreras, 1000000 bucles cada una)

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

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

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