Menu
CoddyTech

Объединение словарей

Часть раздела Логика и потоки выполнения путешествия по GDScript на Coddy. Урок 21 из 78.

merge() добавляет каждую пару из другого словаря в словарь, для которого вы вызываете этот метод. Ключи, которые есть только в другом словаре, добавляются в конец:

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

"difficulty" есть в обоих словарях, и merge() сохранил значение, которое уже было в settings: по умолчанию существующие ключи не перезаписываются. Передай true вторым аргументом, чтобы приоритет был у другого словаря:

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

merge() изменяет сам словарь и ничего не возвращает, поэтому var result := a.merge(b) — ошибка. Чтобы оставить оба словаря без изменений, используйте merged(). Он принимает те же аргументы и возвращает новый словарь:

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" }

Если ключ есть в обоих словарях и вы хотите объединить значения, например сложить две суммы, напишите цикл самостоятельно:

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

Задание

Легко

В обновлении игры появились новые настройки. Сохранённые настройки игрока считываются из одной строки ввода в виде пар key=value, разделённых запятыми (строка может быть пустой). Данный код сохраняет их в словаре saved.

Заполни настройки, которых не хватает в сохранении: добавь в saved каждую пару из defaults, ключа которой там ещё нет, не изменяя выбранные игроком значения и не изменяя defaults. Затем выведи saved, а на следующей строке выведи defaults.

Для ввода difficulty=hard,volume=8 вывод будет таким:

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

Попробуйте сами

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]

	# Добавьте недостающие значения по умолчанию в saved, затем выведите оба словаря
	pass
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и потоки выполнения

Потренируйтесь самостоятельно: Онлайн-компилятор GDScript