7.1 Creación de diccionarios anidados
Los diccionarios anidados son una manera muy conveniente de describir estructuras de datos complejas, con la que te encontrarás muy a menudo. Practiquemos un poco en su creación.
Creación de diccionarios anidados
Aquí hay un ejemplo de cómo crear un diccionario anidado:
person = {
"name": "Alice",
"details": {
"age": 25,
"city": "New York",
"address": {
"street": "123 Main St",
"zip": "10001"
},
"mother": "Jane Smith"
},
"gender": "female"
}
print(person) # Salida: {'name': 'Alice', 'details': {'age': 25, 'city': 'New York', 'address': {'street': '123 Main St', 'zip': '10001'}, 'mother': 'Jane Smith'}, 'gender': 'female'}
En este ejemplo, person
es un diccionario que contiene un diccionario anidado details
, que a su vez contiene otro diccionario anidado address
.
Un diccionario anidado también puede crearse a partir de partes:
address = {
"street": "123 Main St",
"zip": "10001"
}
details = {
"age": 25,
"city": "New York",
"address": address
}
person = {
"name": "Alice",
"details": details,
"gender": "female"
}
print(person) # Salida: {'name': 'Alice', 'details': {'age': 25, 'city': 'New York', 'address': {'street': '123 Main St', 'zip': '10001'}}, 'gender': 'female'}
7.2 Acceso a elementos de un diccionario anidado
Acceder a los elementos de diccionarios anidados es simple y directo. Aquí te mostramos cómo hacerlo:
Acceso a elementos de nivel superior
name = person["name"]
print(name) # Salida: Alice
Acceso a elementos de un diccionario anidado
age = person["details"]["age"]
city = person["details"]["city"]
print(age) # Salida: 25
print(city) # Salida: New York
Acceso a elementos de niveles más profundos
street = person["details"]["address"]["street"]
zip_code = person["details"]["address"]["zip"]
print(street) # Salida: 123 Main St
print(zip_code) # Salida: 10001
7.3 Modificación de elementos en diccionarios anidados
Si ya has aprendido cómo mostrar elementos de cualquier nivel de anidación, entonces cambiarlos será aún más fácil:
Modificación de valores de nivel superior
person["name"] = "Bob"
print(person["name"]) # Salida: Bob
Modificación de valores en un diccionario anidado
person["details"]["age"] = 26
print(person["details"]["age"]) # Salida: 26
Modificación de valores en niveles más profundos
person["details"]["address"]["city"] = "Los Angeles"
print(person["details"]["address"]["city"]) # Salida: Los Angeles
Adición de nuevos elementos a un diccionario anidado
person["details"]["phone"] = "123-456-7890"
print(person["details"]["phone"]) # Salida: 123-456-7890
Eliminación de elementos de nivel superior
# Eliminamos el elemento 'country' del diccionario 'person'
del person["country"]
print(person) # El elemento 'country' será eliminado del diccionario
Eliminación de elementos en un diccionario anidado
# Eliminamos el elemento 'phone' del diccionario 'details'
del person["details"]["phone"]
print(person["details"]) # El elemento 'phone' será eliminado del diccionario 'details'
7.4 Recorrido de diccionarios anidados
Hay varias formas de recorrer todos los elementos de un diccionario. Los bucles son la forma más sencilla:
Iteración sobre elementos de un diccionario anidado
for key, value in person.items(): # Recorrido del diccionario padre
if isinstance(value, dict): # Si el valor es un diccionario
for key2, value2 in value.items(): # Recorrido de los elementos del diccionario hijo
print(f"{key} --> {key2}: {value2}")
Iteración recursiva en todos los niveles de anidación
def print_dict(d, indent=0):
for key, value in d.items():
print(" " * indent + str(key) + ": ", end="")
if isinstance(value, dict):
print()
print_dict(value, indent + 1)
else:
print(value)
print_dict(person)
Aprenderás más sobre recursividad en el tema «Algoritmos y Estructuras de Datos».
Por cierto, la recursividad es útil para buscar valores en lo profundo de los diccionarios anidados. Aquí tienes un ejemplo:
def find_key(d, key):
if key in d:
return d[key]
for k, v in d.items():
if isinstance(v, dict):
result = find_key(v, key)
if result:
return result
return None
phone = find_key(person, "phone")
print(phone) # Salida: None (ya que el elemento 'phone' fue eliminado)
GO TO FULL VERSION