Menu
CoddyTech

Từ điển lồng nhau

Thuộc phần Logic và luồng chương trình trong hành trình GDScript của Coddy. Bài học 19 trên 78.

Giá trị trong từ điển có thể là một từ điển khác. Từ điển lồng nhau nhóm các dữ liệu có liên quan: các khóa bên ngoài đặt tên cho các bản ghi, còn mỗi từ điển bên trong chứa các trường của một bản ghi.

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

Liên kết các khóa để truy cập giá trị bên trong. heroes["Mia"] là từ điển bên trong của Mia, còn ["hp"] đọc giá trị từ đó. Cách gán cũng tương tự:

print(heroes["Mia"]["hp"]) # 100
heroes["Leo"]["hp"] -= 30 # Leo chịu sát thương
heroes["Mia"]["mana"] = 50 # Chỉ thêm một cặp khóa-giá trị cho Mia
print(heroes["Mia"])
{ "hp": 100, "class": "mage", "mana": 50 }

Để thêm toàn bộ bản ghi, hãy gán một từ điển cho khóa bên ngoài mới: heroes["Ana"] = {"hp": 90, "class": "archer"}.

Thiếu khóa ở bất kỳ cấp nào đều gây ra lỗi. Khi một bản ghi có thể bị thiếu, hãy gọi get() với một từ điển rỗng làm giá trị mặc định, rồi gọi get() lần nữa trên kết quả:

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

Để truy cập mọi giá trị bên trong, hãy lặp qua các khóa bên ngoài và đọc dữ liệu từ từng từ điển bên trong:

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

Thử thách

Dễ

Từ điển lồng nhau inventory đã cho: mỗi khóa bên ngoài là một phòng ban, mỗi khóa bên trong là một mặt hàng, và mỗi giá trị bên trong là số lượng tồn kho.

Chương trình đọc một dòng: các lượt tra cứu được viết theo dạng department/item và phân tách bằng dấu phẩy. Với mỗi lượt tra cứu, in ra một dòng theo đúng thứ tự:

  • lượt tra cứu, dấu hai chấm, dấu cách và số lượng, nếu phòng ban đó có mặt hàng ấy
  • lượt tra cứu theo sau bởi : missing, nếu phòng ban hoặc mặt hàng không tồn tại

Sau đó, in ra Total inventory: theo sau là tổng số lượng của mọi mặt hàng trong mọi phòng ban.

Với đầu vào fruits/apples,meat/beef,fruits/kiwis,candy/gum, đầu ra là:

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

Tự làm thử

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

	# In ra số lượng cho từng mục tra cứu, hoặc "missing" nếu không tìm thấy

	# In ra tổng của tất cả số lượng
	pass
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Logic và luồng chương trình

Tự luyện tập: Trình biên dịch GDScript online