Menu
CoddyTech

Combinar diccionarios

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

merge() añade cada par del otro diccionario al diccionario sobre el que lo llamas. Las claves que solo están en el otro diccionario se añaden al final:

var settings := {"volume": 5, "difficulty": "normal"}
var saved := {"difficulty": "hard", "subtitles": true}
settings.merge(saved)
print(settings)
{ "volume": 5, "difficulty": "normal", "subtitles": true }

"difficulty" está en ambos diccionarios, y merge() conservó el valor que settings ya tenía: de forma predeterminada, las claves existentes no se sobrescriben. Pasa true como segundo argumento para que prevalezca el otro diccionario:

var options := {"volume": 5, "difficulty": "normal"}
options.merge(saved, true)
print(options["difficulty"]) # hard

merge() modifica el propio diccionario y no devuelve nada, así que var result := a.merge(b) es un error. Para mantener ambos diccionarios tal como están, usa merged(). Acepta los mismos argumentos y devuelve un diccionario nuevo:

var defaults := {"volume": 5, "difficulty": "normal"}
var choice := {"difficulty": "hard"}
var final_settings := defaults.merged(choice, true)
print(final_settings) # { "volume": 5, "difficulty": "hard" }
print(defaults) # { "volume": 5, "difficulty": "normal" }

Cuando una clave está en ambos diccionarios y quieres combinar los valores, por ejemplo, sumar dos cantidades, escribe el bucle tú mismo:

var bag := {"gold": 10, "gems": 1}
var loot := {"gold": 5, "keys": 2}
for key in loot:
	bag[key] = bag.get(key, 0) + loot[key]
print(bag) # { "gold": 15, "gems": 1, "keys": 2 }
challenge icon

Desafío

Fácil

Una actualización del juego añadió nuevos ajustes. Los ajustes guardados del jugador se leen de una línea de entrada, escritos como pares key=value separados por comas (la línea puede estar vacía). El código proporcionado los almacena en el diccionario saved.

Completa los ajustes que faltan en el archivo guardado: añade a saved cada par de defaults cuya clave todavía no esté en él, sin cambiar los valores que eligió el jugador y sin cambiar defaults. Después, imprime saved e imprime defaults en la línea siguiente.

Para la entrada difficulty=hard,volume=8, la salida es:

{ "difficulty": "hard", "volume": "8", "subtitles": "off", "language": "en" }
{ "difficulty": "normal", "volume": "5", "subtitles": "off", "language": "en" }

Pruébalo tú mismo

extends Node

func _ready():
	var defaults := {"difficulty": "normal", "volume": "5", "subtitles": "off", "language": "en"}
	var saved := {}
	for pair in OS.read_string_from_stdin().split(",", false):
		var parts := pair.split("=")
		saved[parts[0]] = parts[1]

	# Agrega los valores predeterminados que faltan a saved y luego imprime ambos diccionarios
	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