Menu
CoddyTech

Dicionários aninhados

Parte da seção Lógica e fluxo do Journey de GDScript da Coddy. Lição 19 de 78.

Um valor de dicionário pode ser outro dicionário. Um dicionário aninhado agrupa dados relacionados: as chaves externas nomeiam os registros, e cada dicionário interno contém os campos de um registro.

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

Encadeie as chaves para acessar um valor interno. heroes["Mia"] é o dicionário interno de Mia, e ["hp"] lê um valor dele. As atribuições funcionam da mesma maneira:

print(heroes["Mia"]["hp"]) # 100
heroes["Leo"]["hp"] -= 30 # Leo sofre dano
heroes["Mia"]["mana"] = 50 # adiciona um par apenas a Mia
print(heroes["Mia"])
{ "hp": 100, "class": "mage", "mana": 50 }

Para adicionar um registro completo, atribua um dicionário a uma nova chave externa: heroes["Ana"] = {"hp": 90, "class": "archer"}.

Uma chave ausente em qualquer um dos níveis é um erro. Quando um registro pode estar ausente, chame get() com um dicionário vazio como valor padrão e, em seguida, chame get() novamente no resultado:

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

Para acessar todos os valores internos, percorra as chaves externas e leia cada dicionário interno:

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

Desafio

Fácil

O dicionário aninhado inventory é fornecido: cada chave externa é um departamento, cada chave interna é um item e cada valor interno é a quantidade em estoque.

O programa lê uma linha: consultas escritas como department/item, separadas por vírgulas. Para cada consulta, na ordem, imprima uma linha:

  • a consulta, dois-pontos, um espaço e a quantidade, quando esse departamento tiver esse item
  • a consulta seguida de : missing, quando o departamento ou o item não existir

Em seguida, imprima Total inventory: seguido da soma de todas as quantidades em todos os departamentos.

Para a entrada fruits/apples,meat/beef,fruits/kiwis,candy/gum, a saída é:

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

Experimente você mesmo

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

	# Imprima a quantidade de cada item consultado ou indique que ele está ausente

	# Imprima a soma de todas as quantidades
	pass
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Lógica e fluxo

Pratique por conta própria: Compilador de GDScript online