Menu
CoddyTech

Вложенные словари

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

Значением словаря может быть другой словарь. Вложенный словарь объединяет связанные данные: внешние ключи обозначают записи, а каждый внутренний словарь содержит поля одной записи.

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

Цепочки ключей позволяют получить доступ к значению внутри. heroes["Mia"] — это внутренний словарь Mia, а ["hp"] считывает значение из него. Присваивания работают так же:

print(heroes["Mia"]["hp"]) # 100
heroes["Leo"]["hp"] -= 30 # Leo получает урон
heroes["Mia"]["mana"] = 50 # добавляет пару только для Mia
print(heroes["Mia"])
{ "hp": 100, "class": "mage", "mana": 50 }

Чтобы добавить целую запись, присвой словарь новому внешнему ключу: heroes["Ana"] = {"hp": 90, "class": "archer"}.

Отсутствие ключа на любом уровне считается ошибкой. Если запись может отсутствовать, вызови get(), указав пустой словарь в качестве значения по умолчанию, а затем снова вызови get() для результата:

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

Чтобы получить доступ к каждому внутреннему значению, перебирай внешние ключи и считывай значения из каждого внутреннего словаря:

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

Задание

Легко

Дан вложенный словарь inventory: каждый внешний ключ — это отдел, каждый внутренний ключ — товар, а каждое внутреннее значение — количество товара на складе.

Программа считывает одну строку: запросы в формате department/item, разделённые запятыми. Для каждого запроса по порядку выведите одну строку:

  • запрос, двоеточие, пробел и количество, если в этом отделе есть такой товар
  • запрос, за которым следует : missing, если такого отдела или товара не существует

Затем выведите Total inventory: , за которым следует сумма количеств всех товаров во всех отделах.

Для входных данных fruits/apples,meat/beef,fruits/kiwis,candy/gum результат будет таким:

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

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

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(",")

	# Выведите количество для каждого искомого элемента или missing, если он не найден

	# Выведите сумму всех количеств
	pass
quiz iconПроверьте себя

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

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

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