Python: Actualizar diccionario anidado

Un Diccionario en Python funciona de manera similar al Diccionario en el mundo real. Las claves de un diccionario deben ser únicas y de tipos de datos inmutables, como strings, enteros y tuplas, pero los valores clave pueden repetirse y ser de cualquier tipo.

Consulte el siguiente artículo para hacerse una idea de los diccionarios:

Diccionario anidado: los diccionarios anidados en Python no son más que diccionarios dentro de un diccionario.

python-nested-dictionary

Considere un registro de empleado como se indica a continuación:

Employees
emp1:
     name:Lisa
     age:29
     designation:Programmer
emp2:
     name:Steve
     age:45
     designation:HR

Aquí, los empleados es el diccionario exterior. emp1, emp2 son claves que tienen otro diccionario como valor. La estructura del diccionario de la información anterior aparece como:

employees:
{
 emp1:
    {
     'name':'Lisa',
     'age':29,
     'designation':'Programmer'
    },
emp2:
    {
     'name':'Steve',
     'age':45,
     'designation':'HR'
    }
}

Considere un diccionario simple como d={'a':1, 'b':2, 'c':3}. Si desea actualizar el valor de ‘b’ a 7 , puede escribir como d['b']=7. Sin embargo, el mismo método no se puede aplicar a los anidados. Eso creará una nueva clave ya que las claves en el diccionario externo solo se buscarán mientras intenta actualizar. Por ejemplo, vea el siguiente código:

# an employee record
Employee = { 
    'emp1': {
        'name': 'Lisa', 
        'age': '29',
        'Designation':'Programmer'
            }, 
    'emp2': {
             'name': 'Steve',
             'age': '45',
             'Designation':'HR'
             }
} 
  
# updating in the way similar to
# simple dictionary
Employee['name']='Kate'
  
print(Employee)
Producción:

{‘name’: ‘Kate’, ‘emp1′: {‘Designation’: ‘Programmer’, ‘name’: ‘Lisa’, ‘age’: ’29’}, ‘emp2′: {‘Designation’: ‘HR ‘, ‘nombre’: ‘Steve’, ‘edad’: ’45’}}

En la salida, mire que ‘name’:’Kate’ se agrega como un nuevo par clave-valor que no es nuestra salida deseada. Consideremos que necesitamos actualizar el nombre del primer empleado como ‘Kate’. Veamos nuestro diccionario como una array 2D. Esto nos ayudará a actualizar la información fácilmente. La vista de array 2D del diccionario anterior se muestra a continuación:

Employee     name        age      Designation
emp1         Lisa         29       Programmer
emp2         Steve        45       HR

Ahora tenemos que actualizar el nombre del primer empleado como ‘Kate’. Así que tenemos que actualizar Employee[‘emp1′][‘name’]. El código modificado se muestra a continuación:

# an employee record
Employee = { 
    'emp1': {
        'name': 'Lisa', 
        'age': '29',
        'Designation':'Programmer'
            }, 
         'emp2': {
             'name': 'Steve',
             'age': '25',
             'Designation':'HR'
                 }
             } 
  
# updating in the way similar to simple dictionary
Employee['emp1']['name']='Kate'
  
print(Employee)
Producción:

{‘emp2′: {‘Designación’: ‘HR’, ‘edad’: ’25’, ‘nombre’: ‘Steve’}, ‘emp1′: {‘Designación’: ‘Programador’, ‘edad’: ’29 ‘, ‘nombre’: ‘Kate’}}

El método anterior actualiza el valor de la clave mencionada si está presente en el diccionario. De lo contrario, crea una nueva entrada. Por ejemplo, si desea agregar un nuevo atributo ‘salario’ para el primer empleado, puede escribir el código anterior como:

# an employee record
Employee = { 
    'emp1': {
        'name': 'Lisa', 
        'age': '29',
        'Designation':'Programmer'
            }, 
         'emp2': {
             'name': 'Steve',
             'age': '25',
             'Designation':'HR'
                 }
             } 
  
# updating in the way similar to 
# simple dictionary
Employee['emp1']['name']='Kate'
  
# adding new key-value pair to first 
# employee record
Employee['emp1']['salary']= 56000
  
print(Employee)
Producción:

{‘emp1′: {‘Designation’: ‘Programmer’, ‘salary’: 56000, ‘name’: ‘Kate’, ‘age’: ’29’}, ‘emp2′: {‘Designation’: ‘HR’, ‘nombre’: ‘Steve’, ‘edad’: ’25’}}

Los métodos anteriores son estáticos. Ahora, para hacerlo interactivo con el usuario, podemos modificar ligeramente el código como se indica a continuación:

# an employee record
Employee = { 
    'emp1': {
        'name': 'Lisa', 
        'age': '29',
        'Designation':'Programmer'
            }, 
         'emp2': {
             'name': 'Steve',
             'age': '25',
             'Designation':'HR'
                 }
             } 
  
# to make the updation dynamic
  
# Get input from the user for which 
# employee he needs to update
empid = input("Employee id :")
  
# which attribute / key to update
attribute = input("Attribute to be updated :")
  
# what value to update
new_value = input("New value :")
  
# updation of the dictionary
Employee[empid][attribute]= new_value
  
  
print(Employee)
Aporte:

Employee id :emp1
Attribute to be updated :name
New value :Kate
Producción:

{‘emp1′: {‘edad’: ’29’, ‘Designación’: ‘Programador’, ‘nombre’: ‘Kate’}, ‘emp2′: {‘edad’: ’25’, ‘Designación’: ‘HR ‘, ‘nombre’: ‘Steve’}}

Tratemos de ser un poco más profesionales!!

Un enfoque alternativo

La idea es aplanar primero el diccionario anidado, luego actualizarlo y volver a aplanarlo. Para hacerlo más claro, considere el siguiente diccionario como ejemplo:

dict1={
       'a':{
            'b':1
           },
        'c':{
            'd':2,
            'e':5
             }
       }

Aplanar un diccionario anidado no es más que agregar la clave principal con la clave real usando los separadores apropiados. El separador puede ser cualquier símbolo. Puede ser una coma (, ), un guión (-), un guión bajo (_), un punto (.) o incluso un espacio ( ). Aquí, después de aplanar con un guión bajo como separador, este diccionario se verá así:

dict1={'a_b':1, 'c_d':2, 'c_e':5}

El aplanamiento se puede hacer fácilmente con los métodos integrados proporcionados por el paqueteflatten-dict en Python. Proporciona métodos para aplanar objetos similares a diccionarios y desacoplarlos. Instale el paquete usando el comando pip como se muestra a continuación:

pip install flatten-dict

flatten()método:

El método flatten tiene varios argumentos para formatearlo de una manera deseable, legible y comprensible. Los dos argumentos más importantes entre todos son:

  1. dict : El diccionario aplanado que tiene que ser convertido
  2. reducer : especifica cómo se une la clave principal con la clave secundaria. Los valores posibles son tupla, ruta, guión bajo o un nombre de función definido por el usuario.
  • tupla: crea una tupla de claves primarias y secundarias como clave y le asigna el valor.
  • ruta: agrega ‘/’ entre la clave principal y la clave secundaria.
  • guión bajo: agrega ‘_’ entre la clave principal y la clave secundaria.
  • Función definida por el usuario: las claves principal y secundaria deben pasarse a la función como argumentos. La función debería devolverlos como una string separada por el símbolo deseado

Otros argumentos enumerate_types, keep_empty_types son opcionales

método unflatten() :

Este método desincrusta el diccionario aplanado y lo convierte en uno anidado. Puede tomar tres argumentos:

  1. dict : el diccionario aplanado que debe revertirse
  2. splitter : El símbolo en el que se debe dividir el diccionario aplanado. Al igual que el método flatten, esto también toma la tupla de valor, la ruta, el guión bajo o una función definida por el usuario.
  3. inverse : toma un valor booleano que indica si la clave y el valor deben invertirse. Esto es opcional.

Consideremos el mismo ejemplo de empleado que probamos anteriormente. El código se da a continuación:

from flatten_dict import flatten
from flatten_dict import unflatten
  
# an employee record
Employee = { 
    'emp1': {
        'name': 'Lisa', 
        'age': '29',
        'Designation':'Programmer'
            }, 
         'emp2': {
             'name': 'Steve',
             'age': '25',
             'Designation':'HR'
                 }
             } 
  
# flattening the dictionary, default 
# reducer is 'tuple'
dict3 = flatten(Employee)
  
print("Flattened dictionary :", dict3)
  
# adding new key-value pair to second 
# employee's record
dict3[('emp2', 'salary')]= 34000
  
print(dict3)
  
# unflattening the dictionary, default 
# splitter is 'tuple'
Employee = unflatten(dict3)
  
print("\nUnflattened and updated dictionary :", Employee)

Producción:

Diccionario aplanado: {(‘emp1′, ‘nombre’): ‘Lisa’, (‘emp1′, ‘edad’): ’29’, (‘emp1′, ‘Designación’): ‘Programador’, (‘emp2′ , ‘nombre’): ‘Steve’, (‘emp2′, ‘edad’): ’25’, (‘emp2′, ‘Designación’): ‘HR’} {(‘emp1′, ‘nombre’):
‘ Lisa’, (‘emp1′, ‘edad’): ’29’, (‘emp1′, ‘Designación’): ‘Programador’, (‘emp2′, ‘nombre’): ‘Steve’, (‘emp2′, ‘edad’): ’25’, (‘emp2′, ‘Designation’): ‘HR’, (‘emp2′, ‘salary’): 34000}

Diccionario sin aplanar y actualizado: {‘emp1′: {‘name’: ‘Lisa’, ‘age’: ’29’, ‘Designation’: ‘Programmer’}, ‘emp2′: {‘name’: ‘Steve’, ‘ edad’: ’25’, ‘Puesto’: ‘HR’, ‘salario’: 34000}}

Publicación traducida automáticamente

Artículo escrito por erakshaya485 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *