Tengo dos diccionarios como este:

my_nested_dictionary= {'key5': 'value5',
                       'key6': {'inner_key6_1': 'inner_value6_1'},
                       'key7': 'value7'}

empty_dict = {}

Si quiero actualizar empty_dict con un dict interno de my_nested_dictionary, puedo hacerlo con este código:

for key, value in my_nested_dictionary.iteritems():
    if key=='key6':
        empty_dictionary.update(value)

Sin embargo, ¿hay alguna forma universal de hacer esto sin usar una 'condición if' codificada exactamente para una tecla? Si tuviera más diccionarios anidados como valor de más claves en my_nested_dictionary, ¿hay alguna forma de actualizar empty_dictionary con todos ellos a la vez?

0
jovicbg 23 feb. 2018 a las 16:24

3 respuestas

La mejor respuesta

Si no necesita actualizar un diccionario existente y solo desea un diccionario que contenga solo diccionarios anidados, puede hacerlo en su lugar:

only_nested = {k: v for k, v in my_nested_dictionary.items() if isinstance(v, dict)}

Por ejemplo, dado este código:

my_nested_dictionary = {'key5': 'value5',
                    'key6': {'inner_key6_1': 'inner_value6_1'},
                    'key7': 'value7',
                    'key8': {'inner_key8_1': 'inner_value8_1'}}

only_nested = {k: v for k, v in my_nested_dictionary.items() if isinstance(v, dict)}
print(only_nested)

Obtenemos esta salida:

{'key6': {'inner_key6_1': 'inner_value6_1'}, 'key8': {'inner_key8_1': 'inner_value8_1'}}
2
Tagc 23 feb. 2018 a las 13:38

Si desea obtener solo las claves en una declaración sin utilizar un if, puede hacerlo como (Python 3):

output = list(filter(lambda key: isinstance(my_nested_dictionary[key], dict), my_nested_dictionary.keys()))

La salida será como ['clave 7'].

Desde allí, puede buscar los valores del diccionario original como desee. De esta manera, no tiene que hacer varias copias de los mismos objetos.

1
swdon 23 feb. 2018 a las 14:03

Si desea consultar un diccionario anidado;

for key, value in my_nested_dictionary.iteritems():
    if isinstance(value, dict):
        empty_dictionary.update(value)
2
ibt23sec5 23 feb. 2018 a las 13:31