Chuyển tới nội dung chính

DICTIONARY TRONG PYTHON


MỤC TIÊU BÀI HỌC

Sau bài học này, học viên có thể:

  • Hiểu cấu trúc dữ liệu dictionary (từ điển) trong Python
  • Thực hiện các thao tác CRUD (Thêm - Đọc - Sửa - Xóa) trên dictionary
  • Sử dụng dictionary lồng nhau (nested dictionary) để mô hình hóa dữ liệu học sinh
  • Duyệt, tìm kiếm, thống kê dữ liệu học sinh bằng dictionary kết hợp vòng lặp, if/else

1. DICTIONARY LÀ GÌ?

Dictionary là kiểu dữ liệu lưu trữ theo cặp key : value (khóa : giá trị), giống một cuốn từ điển thật — tra khóa để lấy nội dung tương ứng.

Đặc điểm:

  • Không cho phép trùng key
  • key phải là kiểu bất biến (immutable): str, int, tuple...
  • value có thể là bất kỳ kiểu dữ liệu nào (kể cả list, dict khác)
  • Từ Python 3.7+, dictionary giữ đúng thứ tự các phần tử được thêm vào

Ví dụ mở đầu: một học sinh

hoc_sinh = {
"ma_hs": "HS001",
"ho_ten": "Nguyễn Văn An",
"lop": "10A1",
"diem_toan": 8.5,
"diem_van": 7.0
}

print(hoc_sinh["ho_ten"]) # Nguyễn Văn An
print(hoc_sinh["diem_toan"]) # 8.5

2. CÁC THAO TÁC CƠ BẢN (CRUD)

2.1. Thêm / Cập nhật (Create / Update)

hoc_sinh["dien_thoai"] = "0901234567" # thêm mới key "dien_thoai"
hoc_sinh["diem_toan"] = 9.0 # cập nhật lại điểm Toán

2.2. Đọc dữ liệu (Read)

# Cách 1: dùng [] -> lỗi KeyError nếu key không tồn tại
print(hoc_sinh["lop"])

# Cách 2: dùng .get() -> an toàn hơn, trả về None nếu không có
print(hoc_sinh.get("diem_anh")) # None
print(hoc_sinh.get("diem_anh", "Chưa có điểm")) # có giá trị mặc định

2.3. Xóa dữ liệu (Delete)

del hoc_sinh["dien_thoai"] # xóa theo key, lỗi nếu key không tồn tại
diem_van = hoc_sinh.pop("diem_van") # xóa và lấy ra giá trị vừa xóa

2.4. Kiểm tra sự tồn tại

if "ma_hs" in hoc_sinh:
print("Đã có mã học sinh")

3. QUẢN LÝ NHIỀU HỌC SINH — DICTIONARY LỒNG NHAU

Trong thực tế, ta cần quản lý cả một lớp học. Cách phổ biến: dùng một dictionary lớn, key là mã học sinh, value là dictionary thông tin của học sinh đó.

danh_sach_hs = {
"HS001": {
"ho_ten": "Nguyễn Văn An",
"lop": "10A1",
"diem": {"toan": 8.5, "van": 7.0, "anh": 9.0}
},
"HS002": {
"ho_ten": "Trần Thị Bình",
"lop": "10A1",
"diem": {"toan": 6.0, "van": 8.0, "anh": 7.5}
},
"HS003": {
"ho_ten": "Lê Văn Cường",
"lop": "10A2",
"diem": {"toan": 9.5, "van": 9.0, "anh": 8.0}
}
}

Truy cập dữ liệu lồng nhau

# Lấy điểm Toán của học sinh HS002
print(danh_sach_hs["HS002"]["diem"]["toan"]) # 6.0

# Thêm điểm Lý cho HS001
danh_sach_hs["HS001"]["diem"]["ly"] = 8.0

4. DUYỆT DICTIONARY — CÁC HÀM CÓ SẴN QUAN TRỌNG

Hàm có sẵnTrả về
.keys()danh sách các key
.values()danh sách các value
.items()danh sách các cặp (key, value)

Đây là các hàm có sẵn của Python (built-in), khác với việc tự định nghĩa hàm bằng def. Ta vẫn dùng được các hàm này bình thường.

Ví dụ: In danh sách toàn bộ học sinh

for ma_hs, thong_tin in danh_sach_hs.items():
print(ma_hs, "-", thong_tin["ho_ten"], "- Lớp", thong_tin["lop"])

Kết quả:

HS001 - Nguyễn Văn An - Lớp 10A1
HS002 - Trần Thị Bình - Lớp 10A1
HS003 - Lê Văn Cường - Lớp 10A2

5. BÀI TOÁN ỨNG DỤNG THỰC TẾ

5.1. Tính điểm trung bình từng học sinh

for ma_hs, thong_tin in danh_sach_hs.items():
tong_diem = 0
so_mon = 0
for diem in thong_tin["diem"].values():
tong_diem = tong_diem + diem
so_mon = so_mon + 1
diem_tb = round(tong_diem / so_mon, 2)
print(thong_tin["ho_ten"], ": ĐTB =", diem_tb)

5.2. Tìm học sinh có điểm trung bình cao nhất

ten_gioi_nhat = ""
diem_cao_nhat = 0

for ma_hs, thong_tin in danh_sach_hs.items():
tong_diem = 0
so_mon = 0
for diem in thong_tin["diem"].values():
tong_diem = tong_diem + diem
so_mon = so_mon + 1
diem_tb = tong_diem / so_mon

if diem_tb > diem_cao_nhat:
diem_cao_nhat = diem_tb
ten_gioi_nhat = thong_tin["ho_ten"]

print("Học sinh xuất sắc nhất:", ten_gioi_nhat, "- ĐTB:", round(diem_cao_nhat, 2))

5.3. Lọc học sinh theo lớp

lop_can_tim = "10A1"
lop_10a1 = {}

for ma_hs, thong_tin in danh_sach_hs.items():
if thong_tin["lop"] == lop_can_tim:
lop_10a1[ma_hs] = thong_tin

print(lop_10a1.keys()) # dict_keys(['HS001', 'HS002'])

5.4. Thống kê số lượng học sinh mỗi lớp

thong_ke_lop = {}

for thong_tin in danh_sach_hs.values():
lop = thong_tin["lop"]
if lop in thong_ke_lop:
thong_ke_lop[lop] = thong_ke_lop[lop] + 1
else:
thong_ke_lop[lop] = 1

print(thong_ke_lop) # {'10A1': 2, '10A2': 1}

5.5. Xếp loại học lực tự động

for ma_hs, thong_tin in danh_sach_hs.items():
tong_diem = 0
so_mon = 0
for diem in thong_tin["diem"].values():
tong_diem = tong_diem + diem
so_mon = so_mon + 1
diem_tb = tong_diem / so_mon

if diem_tb >= 8.0:
xep_loai = "Giỏi"
elif diem_tb >= 6.5:
xep_loai = "Khá"
elif diem_tb >= 5.0:
xep_loai = "Trung bình"
else:
xep_loai = "Yếu"

print(thong_tin["ho_ten"], ":", round(diem_tb, 2), "->", xep_loai)

6. CHƯƠNG TRÌNH HOÀN CHỈNH: MENU QUẢN LÝ HỌC SINH

danh_sach_hs = {}
tiep_tuc = True

while tiep_tuc:
print("\n===== QUẢN LÝ HỌC SINH =====")
print("1. Thêm học sinh")
print("2. Nhập điểm")
print("3. In danh sách")
print("4. Xóa học sinh")
print("0. Thoát")
chon = input("Chọn chức năng: ")

if chon == "1":
ma = input("Nhập mã học sinh: ")
ten = input("Nhập họ tên: ")
lop = input("Nhập lớp: ")
danh_sach_hs[ma] = {"ho_ten": ten, "lop": lop, "diem": {}}
print("Đã thêm học sinh thành công!")

elif chon == "2":
ma = input("Nhập mã học sinh: ")
if ma not in danh_sach_hs:
print("Không tìm thấy học sinh!")
else:
mon = input("Nhập tên môn học: ")
diem = float(input("Nhập điểm: "))
danh_sach_hs[ma]["diem"][mon] = diem
print("Đã cập nhật điểm!")

elif chon == "3":
if len(danh_sach_hs) == 0:
print("Danh sách trống!")
else:
for ma, thong_tin in danh_sach_hs.items():
if len(thong_tin["diem"]) > 0:
tong_diem = 0
so_mon = 0
for diem in thong_tin["diem"].values():
tong_diem = tong_diem + diem
so_mon = so_mon + 1
diem_tb = round(tong_diem / so_mon, 2)
else:
diem_tb = 0
print(ma, "|", thong_tin["ho_ten"], "|", thong_tin["lop"], "| ĐTB:", diem_tb)

elif chon == "4":
ma = input("Nhập mã học sinh cần xóa: ")
if ma in danh_sach_hs:
danh_sach_hs.pop(ma)
print("Đã xóa!")
else:
print("Không tìm thấy học sinh!")

elif chon == "0":
print("Tạm biệt!")
tiep_tuc = False

else:
print("Lựa chọn không hợp lệ!")

7. LỖI THƯỜNG GẶP KHI DÙNG DICTIONARY

LỗiNguyên nhânCách khắc phục
KeyErrorTruy cập key không tồn tại bằng []Dùng .get() hoặc kiểm tra in trước
Ghi đè dữ liệu ngoài ý muốnGán trùng key đã tồn tạiKiểm tra if key not in dict trước khi thêm mới
Nhầm giữa listdict lồng nhauCấu trúc dữ liệu không nhất quánThiết kế cấu trúc dữ liệu rõ ràng ngay từ đầu
Duyệt vừa xóa phần tử trong dictThay đổi kích thước dict khi đang lặpTạo bản sao danh sách key trước: list(dict.keys())

8. BÀI TẬP THỰC HÀNH

  1. Viết đoạn code cho phép sửa họ tên hoặc lớp của một học sinh theo mã học sinh nhập vào.
  2. Viết đoạn code tính điểm trung bình chung của cả một lớp (ví dụ lớp "10A1").
  3. Viết đoạn code in ra danh sách học sinh Giỏi (ĐTB ≥ 8.0).
  4. Viết đoạn code đếm xem có bao nhiêu học sinh đạt loại Giỏi, Khá, Trung bình, Yếu.
  5. Viết đoạn code tìm học sinh có điểm Toán cao nhất trong toàn bộ danh sách.