Menu
CoddyTech

Diccionarios anidados

Parte de la sección Lógica y flujo del Journey de GDScript de Coddy. Lección 19 de 78.

Un valor de un diccionario puede ser otro diccionario. Un diccionario anidado agrupa datos relacionados: las claves externas indican los registros, y cada diccionario interno contiene los campos de un registro.

var heroes := {
	"Mia": {"hp": 100, "class": "mage"},
	"Leo": {"hp": 80, "class": "knight"}
}

Encadena las claves para acceder a un valor interno. heroes["Mia"] es el diccionario interno de Mia, y ["hp"] lee un valor de ese diccionario. Las asignaciones funcionan igual:

print(heroes["Mia"]["hp"]) # 100
heroes["Leo"]["hp"] -= 30 # Leo recibe daño
heroes["Mia"]["mana"] = 50 # añade un par solo a Mia
print(heroes["Mia"])
{ "hp": 100, "class": "mage", "mana": 50 }

Para agregar un registro completo, asigna un diccionario a una nueva clave externa: heroes["Ana"] = {"hp": 90, "class": "archer"}.

Una clave que falte en cualquiera de los niveles es un error. Cuando puede faltar un registro, llama a get() con un diccionario vacío como valor predeterminado y, después, vuelve a llamar a get() sobre el resultado:

print(heroes.get("Zed", {}).get("hp", 0)) # 0

Para acceder a cada valor interno, recorre las claves externas y lee de cada diccionario interno:

var total_hp := 0
for hero in heroes:
	total_hp += heroes[hero]["hp"]
print(total_hp) # 150
challenge icon

Desafío

Fácil

Se proporciona el diccionario anidado inventory: cada clave externa es un departamento, cada clave interna un artículo y cada valor interno la cantidad en existencias.

El programa lee una línea: consultas escritas como department/item, separadas por comas. Para cada consulta, en orden, imprime una línea:

  • la consulta, dos puntos, un espacio y la cantidad, cuando ese departamento tiene ese artículo
  • la consulta seguida de : missing, cuando el departamento o el artículo no existe

Después, imprime Total inventory: seguido de la suma de todas las cantidades de todos los departamentos.

Para la entrada fruits/apples,meat/beef,fruits/kiwis,candy/gum, la salida es:

fruits/apples: 12
meat/beef: 7
fruits/kiwis: missing
candy/gum: missing
Total inventory: 39

Pruébalo tú mismo

extends Node

func _ready():
	var inventory := {
		"fruits": {"apples": 12, "bananas": 4},
		"meat": {"beef": 7, "chicken": 5},
		"dairy": {"milk": 9, "cheese": 2}
	}
	var lookups := OS.read_string_from_stdin().split(",")

	# Imprime la cantidad correspondiente a cada búsqueda o indica que falta

	# Imprime la suma de todas las cantidades
	pass
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Lógica y flujo

Practica por tu cuenta: Compilador de GDScript online