Skip to content

📝 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

🐍 Khóa học Python căn bản bằng tiếng Việt