🧩 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} và {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