Объединение словарей
Часть раздела Логика и потоки выполнения путешествия по 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"]) # hardmerge() изменяет сам словарь и ничего не возвращает, поэтому 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 }Задание
ЛегкоВ обновлении игры появились новые настройки. Сохранённые настройки игрока считываются из одной строки ввода в виде пар 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
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и потоки выполнения
1Строки: углублённое изучение
Методы строкПоиск в строкахЗамена и обрезка пробеловРазделение и объединениеПовторение — проверка имени пользователя4Словари. Часть 2
Вложенные словариМассивы словарейОбъединение словарейКопирование словарейПовторение — подсчёт частоты10Продвинутые функции
Возврат нескольких значенийЛямбда-функции. Часть 1Лямбда-функции. Часть 2Повторение — сортировка с помощью лямбда-функцииРекурсивные функции. Часть 1Рекурсивные функции. Часть 2Повторение — сумма вложенного массива13Система управления запасами
Обзор проектаДобавление товара2Продвинутое управление ветвлением
Сопоставление с переменнымиУсловия в шаблонахШаблоны массивовШаблоны словарейПроверка принадлежностиИтоги — парсер команд5Приложение «Телефонная книга»
Показать менюДобавить контакт8Менеджер успеваемости студентов
Обзор проектаДобавить студента3Многомерные массивы
Основы двумерных массивовДоступ к элементам двумерного массиваВложенные циклы с двумерными массивамиПовторение: двумерные массивыРваные массивыТипичные шаблоны работы с двумерными массивамиПовторение: игровое поле6Множества и словари
Что такое множество?Словарь как множествоДобавление и удалениеОбъединение и пересечениеРазность множествПовторение — удаление дубликатовПотренируйтесь самостоятельно: Онлайн-компилятор GDScript