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 keyphải là kiểu bất biến (immutable):str,int,tuple...valuecó 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ẵn | Trả 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ỗi | Nguyên nhân | Cách khắc phục |
|---|---|---|
KeyError | Truy 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ốn | Gán trùng key đã tồn tại | Kiểm tra if key not in dict trước khi thêm mới |
Nhầm giữa list và dict lồng nhau | Cấu trúc dữ liệu không nhất quán | Thiế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 dict | Thay đổi kích thước dict khi đang lặp | Tạo bản sao danh sách key trước: list(dict.keys()) |
8. BÀI TẬP THỰC HÀNH
- 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.
- 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").
- Viết đoạn code in ra danh sách học sinh Giỏi (ĐTB ≥ 8.0).
- 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.
- 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.