📝 12.4 Bài tập dictionary
📖 Giới thiệu
Bài học này sẽ giúp bạn luyện tập và củng cố toàn bộ kiến thức về dictionary thông qua các bài tập từ cơ bản đến nâng cao. Mỗi bài tập đều có lời giải chi tiết và ứng dụng thực tế.
INFO
Thực hành với dictionary sẽ giúp bạn xử lý dữ liệu hiệu quả hơn
🏫 Bài tập quản lý học tập
📚 Bài 1: Hệ thống quản lý điểm
python
# Dữ liệu điểm học sinh
bang_diem = {
"HS001": {
"ten": "Nguyễn Văn An",
"lop": "10A1",
"diem": {
"Toán": [8, 7.5, 9, 8.5],
"Lý": [7, 8, 8.5, 9],
"Hóa": [9, 8.5, 8, 9.5],
"Văn": [8, 8.5, 7.5, 8]
}
},
"HS002": {
"ten": "Trần Thị Bình",
"lop": "10A1",
"diem": {
"Toán": [7, 8, 7.5, 8.5],
"Lý": [8.5, 9, 8, 9.5],
"Hóa": [7.5, 8, 9, 8.5],
"Văn": [9, 8.5, 9.5, 9]
}
},
"HS003": {
"ten": "Lê Văn Chi",
"lop": "10A2",
"diem": {
"Toán": [9, 9.5, 8.5, 9],
"Lý": [8, 8.5, 9, 8.5],
"Hóa": [8.5, 9, 9.5, 9],
"Văn": [7, 7.5, 8, 7.5]
}
}
}
def tinh_diem_trung_binh_mon(diem_list):
"""Tính điểm trung bình của một môn"""
return sum(diem_list) / len(diem_list)
def tinh_diem_trung_binh_tong(bang_diem_hs):
"""Tính điểm trung bình tổng của học sinh"""
tong_diem = 0
so_mon = 0
for mon, diem_list in bang_diem_hs.items():
tb_mon = tinh_diem_trung_binh_mon(diem_list)
tong_diem += tb_mon
so_mon += 1
return tong_diem / so_mon
def in_bang_diem_hoc_sinh(ma_hs, thong_tin):
"""In bảng điểm của một học sinh"""
print(f"\n📊 BẢNG ĐIỂM - {thong_tin['ten']} ({ma_hs})")
print(f"🏫 Lớp: {thong_tin['lop']}")
print("-" * 50)
for mon, diem_list in thong_tin['diem'].items():
tb_mon = tinh_diem_trung_binh_mon(diem_list)
print(f"{mon:8}: {diem_list} → TB: {tb_mon:.2f}")
tb_tong = tinh_diem_trung_binh_tong(thong_tin['diem'])
print(f"\n🎯 Điểm trung bình tổng: {tb_tong:.2f}")
def tim_hoc_sinh_gioi_nhat(bang_diem):
"""Tìm học sinh có điểm trung bình cao nhất"""
hs_gioi_nhat = None
diem_cao_nhat = 0
for ma_hs, thong_tin in bang_diem.items():
tb_tong = tinh_diem_trung_binh_tong(thong_tin['diem'])
if tb_tong > diem_cao_nhat:
diem_cao_nhat = tb_tong
hs_gioi_nhat = (ma_hs, thong_tin['ten'], tb_tong)
return hs_gioi_nhat
# Test các hàm
for ma_hs, thong_tin in bang_diem.items():
in_bang_diem_hoc_sinh(ma_hs, thong_tin)
hs_gioi = tim_hoc_sinh_gioi_nhat(bang_diem)
print(f"\n🏆 Học sinh giỏi nhất: {hs_gioi[1]} - {hs_gioi[2]:.2f} điểm")TIP
Sử dụng nested dictionary để lưu trữ dữ liệu phức tạp
👥 Bài 2: Quản lý thông tin lớp học
python
def tao_lop_hoc():
"""Tạo hệ thống quản lý lớp học"""
lop_hoc = {
"ten_lop": "10A1",
"giao_vien_chu_nhiem": "Cô Nguyễn Thị Lan",
"hoc_sinh": {},
"thong_ke": {
"si_so": 0,
"nam": 0,
"nu": 0
}
}
return lop_hoc
def them_hoc_sinh(lop, ma_hs, ten, gioi_tinh, ngay_sinh, que_quan):
"""Thêm học sinh vào lớp"""
lop["hoc_sinh"][ma_hs] = {
"ten": ten,
"gioi_tinh": gioi_tinh,
"ngay_sinh": ngay_sinh,
"que_quan": que_quan
}
# Cập nhật thống kê
lop["thong_ke"]["si_so"] += 1
if gioi_tinh.lower() == "nam":
lop["thong_ke"]["nam"] += 1
else:
lop["thong_ke"]["nu"] += 1
def in_danh_sach_lop(lop):
"""In danh sách học sinh trong lớp"""
print(f"🏫 LỚP {lop['ten_lop']}")
print(f"👩🏫 GVCN: {lop['giao_vien_chu_nhiem']}")
print(f"👥 Sĩ số: {lop['thong_ke']['si_so']} ({lop['thong_ke']['nam']} nam, {lop['thong_ke']['nu']} nữ)")
print("-" * 60)
for ma_hs, thong_tin in lop["hoc_sinh"].items():
print(f"{ma_hs}: {thong_tin['ten']} - {thong_tin['gioi_tinh']} - {thong_tin['que_quan']}")
# Tạo và test lớp học
lop_10a1 = tao_lop_hoc()
# Thêm học sinh
them_hoc_sinh(lop_10a1, "HS001", "Nguyễn Văn An", "Nam", "01/05/2008", "Hà Nội")
them_hoc_sinh(lop_10a1, "HS002", "Trần Thị Bình", "Nữ", "15/03/2008", "TP.HCM")
them_hoc_sinh(lop_10a1, "HS003", "Lê Văn Chi", "Nam", "20/07/2008", "Đà Nẵng")
them_hoc_sinh(lop_10a1, "HS004", "Phạm Thị Dung", "Nữ", "10/12/2008", "Hải Phòng")
in_danh_sach_lop(lop_10a1)🏪 Bài tập kinh doanh
🛒 Bài 3: Hệ thống cửa hàng điện tử
python
# Dữ liệu cửa hàng
cua_hang = {
"ten": "TechStore Vietnam",
"san_pham": {
"SP001": {
"ten": "iPhone 15 Pro",
"gia": 28000000,
"so_luong": 50,
"danh_muc": "Điện thoại",
"hang": "Apple"
},
"SP002": {
"ten": "Samsung Galaxy S24",
"gia": 25000000,
"so_luong": 30,
"danh_muc": "Điện thoại",
"hang": "Samsung"
},
"SP003": {
"ten": "MacBook Air M2",
"gia": 35000000,
"so_luong": 20,
"danh_muc": "Laptop",
"hang": "Apple"
},
"SP004": {
"ten": "Dell XPS 13",
"gia": 30000000,
"so_luong": 15,
"danh_muc": "Laptop",
"hang": "Dell"
}
},
"don_hang": [],
"doanh_thu": 0
}
def tim_san_pham(cua_hang, tu_khoa):
"""Tìm sản phẩm theo tên hoặc mã"""
ket_qua = {}
for ma_sp, thong_tin in cua_hang["san_pham"].items():
if (tu_khoa.lower() in thong_tin["ten"].lower() or
tu_khoa.upper() == ma_sp):
ket_qua[ma_sp] = thong_tin
return ket_qua
def ban_hang(cua_hang, ma_sp, so_luong, khach_hang):
"""Xử lý bán hàng"""
san_pham = cua_hang["san_pham"]
if ma_sp not in san_pham:
return f"❌ Không tìm thấy sản phẩm {ma_sp}"
sp = san_pham[ma_sp]
if sp["so_luong"] < so_luong:
return f"❌ Không đủ hàng. Còn lại: {sp['so_luong']}"
# Tính tiền
thanh_tien = sp["gia"] * so_luong
# Cập nhật kho
sp["so_luong"] -= so_luong
# Lưu đơn hàng
don_hang = {
"ma_sp": ma_sp,
"ten_sp": sp["ten"],
"so_luong": so_luong,
"gia": sp["gia"],
"thanh_tien": thanh_tien,
"khach_hang": khach_hang
}
cua_hang["don_hang"].append(don_hang)
cua_hang["doanh_thu"] += thanh_tien
return f"✅ Bán thành công {so_luong} {sp['ten']} = {thanh_tien:,} VND"
def thong_ke_kho_hang(cua_hang):
"""Thống kê tình trạng kho hàng"""
print("📦 THỐNG KÊ KHO HÀNG")
print("="*60)
tong_gia_tri = 0
sp_sap_het = []
for ma_sp, sp in cua_hang["san_pham"].items():
gia_tri = sp["gia"] * sp["so_luong"]
tong_gia_tri += gia_tri
if sp["so_luong"] < 10:
sp_sap_het.append((ma_sp, sp["ten"], sp["so_luong"]))
print(f"{ma_sp}: {sp['ten']}")
print(f" 💰 Giá: {sp['gia']:,} VND")
print(f" 📦 Tồn kho: {sp['so_luong']}")
print(f" 💎 Giá trị: {gia_tri:,} VND")
print()
print(f"💰 Tổng giá trị kho: {tong_gia_tri:,} VND")
if sp_sap_het:
print("\n⚠️ SẢN PHẨM SẮP HẾT:")
for ma_sp, ten, so_luong in sp_sap_het:
print(f" • {ten}: {so_luong} chiếc")
# Test hệ thống
print("🔍 Tìm iPhone:")
ket_qua = tim_san_pham(cua_hang, "iPhone")
for ma, info in ket_qua.items():
print(f" {ma}: {info['ten']} - {info['gia']:,} VND")
print("\n🛒 Thực hiện bán hàng:")
print(ban_hang(cua_hang, "SP001", 2, "Nguyễn Văn A"))
print(ban_hang(cua_hang, "SP003", 1, "Trần Thị B"))
print(f"\n💰 Doanh thu hiện tại: {cua_hang['doanh_thu']:,} VND")
thong_ke_kho_hang(cua_hang)WARNING
Luôn kiểm tra tính hợp lệ của dữ liệu trước khi thực hiện thao tác
💰 Bài 4: Phân tích doanh thu theo khu vực
python
# Doanh thu các chi nhánh theo quý
doanh_thu_khu_vuc = {
"Miền Bắc": {
"Q1": 450000000,
"Q2": 520000000,
"Q3": 480000000,
"Q4": 650000000
},
"Miền Trung": {
"Q1": 280000000,
"Q2": 320000000,
"Q3": 350000000,
"Q4": 420000000
},
"Miền Nam": {
"Q1": 680000000,
"Q2": 750000000,
"Q3": 720000000,
"Q4": 850000000
}
}
def phan_tich_doanh_thu_tong_the(data):
"""Phân tích tổng thể doanh thu"""
print("📊 PHÂN TÍCH DOANH THU TOÀN QUỐC")
print("="*50)
# Tính tổng theo khu vực
for khu_vuc, doanh_thu_quy in data.items():
tong_khu_vuc = sum(doanh_thu_quy.values())
tb_quy = tong_khu_vuc / 4
print(f"\n🌍 {khu_vuc}:")
print(f" 💰 Tổng năm: {tong_khu_vuc:,} VND")
print(f" 📊 TB/quý: {tb_quy:,} VND")
# Tìm quý cao nhất
quy_max = max(doanh_thu_quy.items(), key=lambda x: x[1])
print(f" 🏆 Quý tốt nhất: {quy_max[0]} ({quy_max[1]:,} VND)")
# Tính tổng toàn quốc
tong_toan_quoc = 0
for doanh_thu_quy in data.values():
tong_toan_quoc += sum(doanh_thu_quy.values())
print(f"\n🇻🇳 TỔNG TOÀN QUỐC: {tong_toan_quoc:,} VND")
def so_sanh_tang_truong_quy(data):
"""So sánh tăng trưởng theo quý"""
print("\n📈 TĂNG TRƯỞNG THEO QUÝ")
print("="*40)
cac_quy = ["Q1", "Q2", "Q3", "Q4"]
for i in range(1, len(cac_quy)):
quy_truoc = cac_quy[i-1]
quy_hien_tai = cac_quy[i]
print(f"\n📅 {quy_truoc} → {quy_hien_tai}:")
for khu_vuc, doanh_thu_quy in data.items():
dt_truoc = doanh_thu_quy[quy_truoc]
dt_hien_tai = doanh_thu_quy[quy_hien_tai]
tang_truong = ((dt_hien_tai - dt_truoc) / dt_truoc) * 100
if tang_truong > 0:
icon = "📈"
elif tang_truong < 0:
icon = "📉"
else:
icon = "➡️"
print(f" {icon} {khu_vuc}: {tang_truong:+.1f}%")
def xep_hang_khu_vuc(data):
"""Xếp hạng khu vực theo doanh thu"""
print("\n🏆 XẾP HẠNG KHU VỰC")
print("="*30)
# Tính tổng doanh thu từng khu vực
tong_khu_vuc = {}
for khu_vuc, doanh_thu_quy in data.items():
tong_khu_vuc[khu_vuc] = sum(doanh_thu_quy.values())
# Sắp xếp theo doanh thu giảm dần
xep_hang = sorted(tong_khu_vuc.items(), key=lambda x: x[1], reverse=True)
for hang, (khu_vuc, tong) in enumerate(xep_hang, 1):
if hang == 1:
medal = "🥇"
elif hang == 2:
medal = "🥈"
else:
medal = "🥉"
# Tính tỷ lệ đóng góp
tong_cong_ty = sum(tong_khu_vuc.values())
ty_le = (tong / tong_cong_ty) * 100
print(f" {medal} {khu_vuc}: {tong:,} VND ({ty_le:.1f}%)")
# Thực hiện phân tích
phan_tich_doanh_thu_tong_the(doanh_thu_khu_vuc)
so_sanh_tang_truong_quy(doanh_thu_khu_vuc)
xep_hang_khu_vuc(doanh_thu_khu_vuc)📊 Bài tập phân tích dữ liệu
🔍 Bài 5: Hệ thống từ điển thông minh
python
class TuDienThongMinh:
def __init__(self):
self.tu_dien = {}
self.lich_su_tim_kiem = []
def them_tu(self, tu_tieng_anh, nghia_tieng_viet, loai_tu=None):
"""Thêm từ mới vào từ điển"""
if tu_tieng_anh not in self.tu_dien:
self.tu_dien[tu_tieng_anh] = []
nghia_moi = {"nghia": nghia_tieng_viet, "loai": loai_tu}
self.tu_dien[tu_tieng_anh].append(nghia_moi)
def tim_tu(self, tu):
"""Tìm nghĩa của từ"""
# Lưu lịch sử tìm kiếm
self.lich_su_tim_kiem.append(tu.lower())
tu_lower = tu.lower()
if tu_lower in self.tu_dien:
return self.tu_dien[tu_lower]
else:
# Tìm từ gần giống
tu_gan_giong = self.tim_tu_gan_giong(tu_lower)
return f"Không tìm thấy '{tu}'. Có phải bạn muốn tìm: {tu_gan_giong}?"
def tim_tu_gan_giong(self, tu):
"""Tìm từ có ký tự giống nhau"""
tu_gan_nhat = []
for tu_trong_dict in self.tu_dien.keys():
# Đếm số ký tự giống nhau
giong_nhau = sum(1 for c1, c2 in zip(tu, tu_trong_dict) if c1 == c2)
if giong_nhau >= len(tu) * 0.7: # 70% ký tự giống nhau
tu_gan_nhat.append(tu_trong_dict)
return tu_gan_nhat[:3] # Trả về 3 từ gần giống nhất
def thong_ke_tu_dien(self):
"""Thống kê từ điển"""
tong_tu = len(self.tu_dien)
# Đếm theo loại từ
loai_tu_count = {}
for cac_nghia in self.tu_dien.values():
for nghia_info in cac_nghia:
loai = nghia_info["loai"]
if loai:
loai_tu_count[loai] = loai_tu_count.get(loai, 0) + 1
print(f"📚 THỐNG KÊ TỪ ĐIỂN")
print(f"📖 Tổng số từ: {tong_tu}")
print("📊 Theo loại từ:")
for loai, so_luong in loai_tu_count.items():
print(f" • {loai}: {so_luong} từ")
def tu_pho_bien(self, top=5):
"""Tìm từ được tìm kiếm nhiều nhất"""
dem_tu = {}
for tu in self.lich_su_tim_kiem:
dem_tu[tu] = dem_tu.get(tu, 0) + 1
# Sắp xếp theo số lần tìm kiếm
top_tu = sorted(dem_tu.items(), key=lambda x: x[1], reverse=True)
print(f"\n🔥 TOP {top} TỪ PHỔ BIẾN:")
for i, (tu, so_lan) in enumerate(top_tu[:top], 1):
print(f" {i}. {tu}: {so_lan} lần")
# Sử dụng từ điển
td = TuDienThongMinh()
# Thêm từ vựng
td.them_tu("hello", "xin chào", "interjection")
td.them_tu("world", "thế giới", "noun")
td.them_tu("python", "con trăn / ngôn ngữ lập trình", "noun")
td.them_tu("programming", "lập trình", "noun")
td.them_tu("computer", "máy tính", "noun")
td.them_tu("study", "học tập", "verb")
td.them_tu("student", "học sinh", "noun")
# Test tìm từ
print("🔍 Tìm từ 'hello':")
print(td.tim_tu("hello"))
print("\n🔍 Tìm từ 'python':")
print(td.tim_tu("python"))
print("\n🔍 Tìm từ không tồn tại:")
print(td.tim_tu("helo")) # Từ sai chính tả
# Mô phỏng người dùng tìm kiếm
cac_tu_tim = ["hello", "python", "study", "hello", "computer", "python", "hello"]
for tu in cac_tu_tim:
td.tim_tu(tu)
# Thống kê
td.thong_ke_tu_dien()
td.tu_pho_bien()Bài tập tự luyện
Bài 1: Quản lý thư viện sách
- Dictionary: sách với mã sách, tên, tác giả, năm xuất bản
- Chức năng: thêm/xóa sách, tìm theo tác giả, thống kê
Bài 2: Hệ thống bỏ phiếu
- Dictionary: ứng viên và số phiếu bầu
- Tính tỷ lệ phần trăm, tìm người thắng cử
Bài 3: Game RPG đơn giản
- Dictionary: nhân vật với HP, MP, level, items
- Chức năng: tăng level, sử dụng item, combat
Bài 4: Phân tích log website
- Dictionary: IP address và số lần truy cập
- Tìm IP truy cập nhiều nhất, thống kê theo giờ
Bài 5: Quản lý menu nhà hàng
- Dictionary: món ăn với giá, category, ingredients
- Tính total bill, lọc theo category, tìm món rẻ nhất
📚 Tóm tắt bài tập
Kỹ năng đã luyện tập:
- ✅ Tạo và quản lý nested dictionary
- ✅ Thêm, sửa, xóa dữ liệu phức tạp
- ✅ Duyệt và tìm kiếm với điều kiện
- ✅ Thống kê và phân tích dữ liệu
- ✅ Xử lý lỗi và validate dữ liệu
Ứng dụng thực tế:
- 🏫 Hệ thống giáo dục (điểm, học sinh, lớp)
- 🏪 Quản lý kinh doanh (bán hàng, kho, doanh thu)
- 📊 Phân tích dữ liệu (thống kê, báo cáo)
- 🎮 Game và ứng dụng giải trí
Tips quan trọng:
- 🔍 Luôn kiểm tra key tồn tại trước khi truy cập
- 🛡️ Sử dụng
.get()để truy cập an toàn - 📊 Kết hợp comprehension để xử lý dữ liệu ngắn gọn
- 🗂️ Tổ chức dữ liệu logic và dễ hiểu
Lời khuyên
Thực hành nhiều với các bài toán thực tế sẽ giúp bạn thành thạo dictionary và ứng dụng vào công việc