Skip to content

🧩 11.3 Bài tập tuple và set

📖 Giới thiệu

Bài học này sẽ giúp bạn củng cố kiến thức về tuple và set thông qua các bài tập thực hành từ cơ bản đến nâng cao. Mỗi bài tập đều có lời giải chi tiết và giải thích.

INFO

Thực hành là cách tốt nhất để nắm vững tuple và set

🔒 Bài tập về Tuple

📍 Bài 1: Quản lý tọa độ

python
# Lưu tọa độ các điểm trên bản đồ
diem_du_lich = [
    ("Hà Nội", 21.0285, 105.8542),
    ("TP.HCM", 10.8231, 106.6297), 
    ("Đà Nẵng", 16.0544, 108.2022),
    ("Hội An", 15.8801, 108.3380),
    ("Sapa", 22.3364, 103.8438)
]

def tim_diem_gan_nhat(diem_goc, danh_sach):
    """Tìm điểm du lịch gần nhất với tọa độ cho trước"""
    lat_goc, lon_goc = diem_goc
    khoang_cach_min = float('inf')
    diem_gan_nhat = None
    
    for ten, lat, lon in danh_sach:
        # Tính khoảng cách đơn giản (Euclidean)
        khoang_cach = ((lat - lat_goc)**2 + (lon - lon_goc)**2)**0.5
        if khoang_cach < khoang_cach_min:
            khoang_cach_min = khoang_cach
            diem_gan_nhat = (ten, lat, lon)
    
    return diem_gan_nhat

# Test
vi_tri_hien_tai = (16.5, 108.0)  # Gần Đà Nẵng
gan_nhat = tim_diem_gan_nhat(vi_tri_hien_tai, diem_du_lich)
print(f"Điểm gần nhất: {gan_nhat[0]} ({gan_nhat[1]}, {gan_nhat[2]})")

TIP

Tuple rất phù hợp để lưu trữ tọa độ vì không thay đổi được

📊 Bài 2: Thông tin nhân viên

python
# Thông tin nhân viên: (ID, Tên, Tuổi, Lương, Phòng ban)
nhan_vien = [
    (1001, "Nguyễn Văn A", 28, 15000000, "IT"),
    (1002, "Trần Thị B", 32, 18000000, "HR"),
    (1003, "Lê Văn C", 25, 12000000, "IT"),
    (1004, "Phạm Thị D", 35, 22000000, "Sales"),
    (1005, "Hoàng Văn E", 29, 16000000, "IT")
]

def thong_ke_phong_ban(nv_list):
    """Thống kê nhân viên theo phòng ban"""
    phong_ban = {}
    
    for nv in nv_list:
        id_nv, ten, tuoi, luong, pb = nv
        if pb not in phong_ban:
            phong_ban[pb] = []
        phong_ban[pb].append((ten, luong))
    
    return phong_ban

def tim_luong_cao_nhat(nv_list):
    """Tìm nhân viên có lương cao nhất"""
    luong_max = 0
    nv_max = None
    
    for nv in nv_list:
        if nv[3] > luong_max:  # nv[3] là lương
            luong_max = nv[3]
            nv_max = nv
    
    return nv_max

# Thống kê
pb_stats = thong_ke_phong_ban(nhan_vien)
for pb, ds_nv in pb_stats.items():
    print(f"📂 Phòng {pb}: {len(ds_nv)} nhân viên")
    for ten, luong in ds_nv:
        print(f"  • {ten}: {luong:,} VND")

# Tìm lương cao nhất
nv_top = tim_luong_cao_nhat(nhan_vien)
print(f"\n🏆 Lương cao nhất: {nv_top[1]} - {nv_top[3]:,} VND")

🔄 Bài 3: Tuple unpacking

python
# Thông tin sản phẩm: (Tên, Giá, Số lượng)
san_pham = [
    ("iPhone 15", 25000000, 50),
    ("Samsung S24", 22000000, 30),
    ("Laptop Dell", 18000000, 25),
    ("AirPods", 5000000, 100)
]

def tinh_tong_gia_tri(sp_list):
    """Tính tổng giá trị kho hàng"""
    tong = 0
    for ten, gia, so_luong in sp_list:  # Unpacking
        gia_tri = gia * so_luong
        tong += gia_tri
        print(f"{ten}: {gia:,} x {so_luong} = {gia_tri:,} VND")
    
    return tong

tong_kho = tinh_tong_gia_tri(san_pham)
print(f"\n💰 Tổng giá trị kho: {tong_kho:,} VND")

🔢 Bài tập về Set

🧮 Bài 4: Xử lý danh sách trùng lặp

python
# Danh sách điểm thi có thể trùng lặp
diem_thi = [8, 7, 9, 8, 6, 7, 10, 9, 8, 5, 7, 9, 10]

def phan_tich_diem(diem_list):
    """Phân tích điểm thi"""
    # Loại bỏ trùng lặp
    diem_unique = set(diem_list)
    
    print(f"📊 Phân tích điểm thi:")
    print(f"Tổng số bài thi: {len(diem_list)}")
    print(f"Số điểm khác nhau: {len(diem_unique)}")
    print(f"Điểm thấp nhất: {min(diem_unique)}")
    print(f"Điểm cao nhất: {max(diem_unique)}")
    print(f"Các điểm xuất hiện: {sorted(diem_unique)}")
    
    # Đếm tần suất
    for diem in sorted(diem_unique):
        so_lan = diem_list.count(diem)
        print(f"Điểm {diem}: {so_lan} học sinh")

phan_tich_diem(diem_thi)

WARNING

Set tự động loại bỏ phần tử trùng lặp và không có thứ tự

📝 Bài 5: So sánh danh sách

python
# Danh sách học sinh 2 lớp
lop_12a1 = {"An", "Bình", "Chi", "Dũng", "Em", "Giang"}
lop_12a2 = {"Bình", "Chi", "Hùng", "Lan", "Mai", "Nam"}

def so_sanh_lop(lop1, lop2, ten_lop1="12A1", ten_lop2="12A2"):
    """So sánh danh sách học sinh 2 lớp"""
    print(f"👥 So sánh lớp {ten_lop1}{ten_lop2}")
    print("="*40)
    
    # Học sinh chung
    hoc_sinh_chung = lop1 & lop2  # Giao
    print(f"🤝 Học sinh ở cả 2 lớp: {hoc_sinh_chung}")
    
    # Chỉ ở lớp 1
    chi_lop1 = lop1 - lop2
    print(f"📚 Chỉ ở {ten_lop1}: {chi_lop1}")
    
    # Chỉ ở lớp 2  
    chi_lop2 = lop2 - lop1
    print(f"📘 Chỉ ở {ten_lop2}: {chi_lop2}")
    
    # Tất cả học sinh
    tat_ca = lop1 | lop2  # Hợp
    print(f"👨‍🎓 Tổng số học sinh: {len(tat_ca)}")
    print(f"📋 Danh sách: {sorted(tat_ca)}")

so_sanh_lop(lop_12a1, lop_12a2)

∪ Bài 6: Phép toán tập hợp nâng cao

python
# Sở thích của học sinh
thich_bong_da = {"An", "Bình", "Chi", "Dũng", "Em"}
thich_bong_ro = {"Bình", "Giang", "Hùng", "An", "Lan"}
thich_boi_loi = {"Chi", "Em", "Giang", "Mai", "Nam"}

def phan_tich_so_thich():
    """Phân tích sở thích học sinh"""
    print("⚽ PHÂN TÍCH SỞ THÍCH HỌC SINH")
    print("="*50)
    
    # Thích cả bóng đá và bóng rổ
    thich_ca_hai = thich_bong_da & thich_bong_ro
    print(f"🏀⚽ Thích cả bóng đá và bóng rổ: {thich_ca_hai}")
    
    # Thích ít nhất 1 môn thể thao
    thich_the_thao = thich_bong_da | thich_bong_ro | thich_boi_loi
    print(f"🏃 Thích thể thao: {len(thich_the_thao)} học sinh")
    
    # Chỉ thích bóng đá
    chi_thich_bong_da = thich_bong_da - thich_bong_ro - thich_boi_loi
    print(f"⚽ Chỉ thích bóng đá: {chi_thich_bong_da}")
    
    # Thích đúng 2 môn
    thich_2_mon = set()
    all_students = thich_the_thao
    for hs in all_students:
        count = 0
        if hs in thich_bong_da: count += 1
        if hs in thich_bong_ro: count += 1  
        if hs in thich_boi_loi: count += 1
        if count == 2:
            thich_2_mon.add(hs)
    
    print(f"🎯 Thích đúng 2 môn: {thich_2_mon}")

phan_tich_so_thich()

🔄 Bài tập kết hợp

🎯 Bài 7: Hệ thống quản lý học sinh

python
# Dữ liệu học sinh: tuple + set
hoc_sinh_data = [
    (1, "Nguyễn Văn An", {"Toán", "Lý", "Hóa"}),
    (2, "Trần Thị Bình", {"Văn", "Sử", "Địa"}),
    (3, "Lê Văn Chi", {"Toán", "Anh", "Tin"}),
    (4, "Phạm Thị Dung", {"Sinh", "Hóa", "Anh"}),
    (5, "Hoàng Văn Em", {"Toán", "Lý", "Tin"})
]

class QuanLyHocSinh:
    def __init__(self, data):
        self.hoc_sinh = data
    
    def tim_theo_mon(self, mon_hoc):
        """Tìm học sinh học môn cụ thể"""
        ket_qua = []
        for id_hs, ten, cac_mon in self.hoc_sinh:
            if mon_hoc in cac_mon:
                ket_qua.append((id_hs, ten))
        return ket_qua
    
    def tim_mon_chung(self, id1, id2):
        """Tìm môn học chung của 2 học sinh"""
        hs1_mon = None
        hs2_mon = None
        
        for id_hs, ten, cac_mon in self.hoc_sinh:
            if id_hs == id1:
                hs1_mon = cac_mon
            elif id_hs == id2:
                hs2_mon = cac_mon
        
        if hs1_mon and hs2_mon:
            return hs1_mon & hs2_mon
        return set()
    
    def thong_ke_mon_hoc(self):
        """Thống kê môn học phổ biến"""
        tat_ca_mon = set()
        for _, _, cac_mon in self.hoc_sinh:
            tat_ca_mon |= cac_mon
        
        thong_ke = {}
        for mon in tat_ca_mon:
            thong_ke[mon] = len(self.tim_theo_mon(mon))
        
        return thong_ke

# Sử dụng
ql = QuanLyHocSinh(hoc_sinh_data)

# Tìm học sinh học Toán
hs_toan = ql.tim_theo_mon("Toán")
print("📐 Học sinh học Toán:")
for id_hs, ten in hs_toan:
    print(f"  {id_hs}. {ten}")

# Tìm môn chung
mon_chung = ql.tim_mon_chung(1, 5)
print(f"\n🤝 Môn chung của An và Em: {mon_chung}")

# Thống kê
thong_ke = ql.thong_ke_mon_hoc()
print("\n📊 Thống kê môn học:")
for mon, so_hs in sorted(thong_ke.items(), key=lambda x: x[1], reverse=True):
    print(f"  {mon}: {so_hs} học sinh")
Bài tập tự luyện

Bài 1: Quản lý thư viện

  • Sách: (ID, Tên, Tác giả, Thể loại_set)
  • Tìm sách theo thể loại
  • Thống kê tác giả phổ biến

Bài 2: Mạng xã hội mini

  • User: (ID, Tên, Bạn_bè_set)
  • Tìm bạn chung
  • Gợi ý kết bạn

Bài 3: Cửa hàng điện tử

  • Sản phẩm: (Mã, Tên, Tính_năng_set, Giá)
  • Tìm sản phẩm theo tính năng
  • So sánh sản phẩm

📚 Tóm tắt

Tuple:

  • Lưu trữ dữ liệu không thay đổi
  • Unpacking để truy cập phần tử
  • Phù hợp cho tọa độ, thông tin cố định

Set:

  • Loại bỏ trùng lặp tự động
  • Phép toán tập hợp: & (giao), | (hợp), - (hiệu)
  • Kiểm tra membership nhanh

Kết hợp:

  • Tuple chứa set để lưu trữ linh hoạt
  • Sử dụng cả hai trong cấu trúc dữ liệu phức tạp

Lời khuyên

Luyện tập thường xuyên với các bài toán thực tế để nắm vững tuple và set

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