Skip to content

🗂️ 11.2 Set - Tập hợp không trùng lặp

📖 Giới thiệu

Set là kiểu dữ liệu lưu trữ các phần tử không trùng lặp và không có thứ tự. Set rất hữu ích để loại bỏ phần tử trùng, kiểm tra thành viên nhanh chóng, và thực hiện các phép toán tập hợp như hợp, giao, hiệu.

Mục tiêu bài học:

  • Hiểu khái niệm và đặc điểm của set
  • Biết cách tạo và thao tác với set
  • Ứng dụng set trong bài toán thực tế

🔧 Cú pháp

Tạo set:

python
# Tạo set từ list
so_set = {1, 2, 3, 4}

# Tạo set từ string
chu_set = set("hello")  # {'h', 'e', 'l', 'o'}

# Set rỗng
rong = set()  # Không dùng {} (đó là dictionary)

Thao tác cơ bản:

python
# Thêm phần tử
so_set.add(5)

# Xóa phần tử
so_set.remove(3)

# Kiểm tra có phần tử
if 2 in so_set:
    print("Có số 2")

🔬 Phân tích & Giải thích chi tiết

1. 🗂️ Tạo và sử dụng set cơ bản

python
# Tạo set từ list có trùng lặp
so_list = [1, 2, 2, 3, 3, 3, 4]
so_set = set(so_list)
print(so_set)  # {1, 2, 3, 4} - Tự động loại bỏ trùng

# Tạo set trực tiếp
mau_sac = {"đỏ", "xanh", "vàng"}
print(mau_sac)

2. ➕ Thêm và xóa phần tử

python
mon_hoc = {"Toán", "Văn", "Anh"}
print(f"Ban đầu: {mon_hoc}")

# Thêm môn mới
mon_hoc.add("Lý")
print(f"Sau khi thêm: {mon_hoc}")

# Thêm môn đã có (không thay đổi)
mon_hoc.add("Toán")
print(f"Thêm môn trùng: {mon_hoc}")

# Xóa môn
mon_hoc.remove("Văn")
print(f"Sau khi xóa: {mon_hoc}")

3. 🔍 Kiểm tra và tìm kiếm

python
hoa_qua = {"táo", "chuối", "cam", "xoài"}

# Kiểm tra có phần tử
if "táo" in hoa_qua:
    print("Có táo")

if "dứa" not in hoa_qua:
    print("Không có dứa")

# Số phần tử
print(f"Có {len(hoa_qua)} loại hoa quả")

💻 Ví dụ minh họa

Ví dụ 1: Loại bỏ điểm trùng lặp

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

print("📊 LỌC ĐIỂM TRÙNG LẶP")
print("=" * 25)

print(f"Điểm gốc: {diem_list}")
print(f"Số điểm: {len(diem_list)}")

# Chuyển thành set để loại bỏ trùng
diem_set = set(diem_list)
print(f"Điểm duy nhất: {sorted(diem_set)}")
print(f"Số điểm duy nhất: {len(diem_set)}")

# Chuyển lại thành list đã sắp xếp
diem_khong_trung = sorted(list(diem_set))
print(f"List đã lọc: {diem_khong_trung}")

# Thống kê
print(f"\nĐã loại bỏ {len(diem_list) - len(diem_set)} điểm trùng")

Ví dụ 2: So sánh danh sách học sinh

python
# Danh sách học sinh 2 lớp
lop_10a = {"An", "Bình", "Chi", "Dũng", "Em"}
lop_10b = {"Bình", "Dũng", "Hoa", "Giang", "Khoa"}

print("👥 SO SÁNH DANH SÁCH LỚP")
print("=" * 30)

print(f"Lớp 10A: {lop_10a}")
print(f"Lớp 10B: {lop_10b}")

# Học sinh chung cả 2 lớp (giao)
chung = lop_10a & lop_10b
print(f"\nHọc sinh chung: {chung}")

# Tất cả học sinh (hợp)
tat_ca = lop_10a | lop_10b
print(f"Tất cả học sinh: {tat_ca}")

# Chỉ ở lớp 10A (hiệu)
chi_10a = lop_10a - lop_10b
print(f"Chỉ ở 10A: {chi_10a}")

# Chỉ ở lớp 10B
chi_10b = lop_10b - lop_10a
print(f"Chỉ ở 10B: {chi_10b}")

# Thống kê
print(f"\nTổng số học sinh: {len(tat_ca)}")
print(f"Học sinh chuyển lớp: {len(chung)}")

Ví dụ 3: Kiểm tra từ vựng

python
# Từ vựng đã học
tu_vung_hoc = {"hello", "world", "python", "code", "learn"}

# Từ trong câu cần kiểm tra
cau = "hello world python is fun to learn"
tu_trong_cau = set(cau.split())

print("📚 KIỂM TRA TỪ VỰNG")
print("=" * 25)

print(f"Từ đã học: {tu_vung_hoc}")
print(f"Từ trong câu: {tu_trong_cau}")

# Từ đã biết trong câu
tu_da_biet = tu_vung_hoc & tu_trong_cau
print(f"\nTừ đã biết: {tu_da_biet}")

# Từ chưa học
tu_chua_hoc = tu_trong_cau - tu_vung_hoc
print(f"Từ chưa học: {tu_chua_hoc}")

# Thống kê
ty_le_biet = len(tu_da_biet) / len(tu_trong_cau) * 100
print(f"\nBiết {len(tu_da_biet)}/{len(tu_trong_cau)} từ ({ty_le_biet:.1f}%)")

if len(tu_chua_hoc) > 0:
    print("🎯 Cần học thêm:")
    for tu in tu_chua_hoc:
        print(f"  - {tu}")
else:
    print("🎉 Bạn đã biết hết từ trong câu!")

🏋️ Thực hành

Bài tập 1: Loại bỏ số trùng

python
# Loại bỏ số trùng lặp
so_list = [1, 2, 2, 3, 3, 3, 4, 4]
so_set = set(so_list)
print(f"Trước: {so_list}")
print(f"Sau: {list(so_set)}")

Bài tập 2: Kiểm tra chữ cái

python
# Kiểm tra chữ cái trong tên
ten = "anna"
chu_cai = set(ten)
print(f"Tên: {ten}")
print(f"Chữ cái duy nhất: {chu_cai}")
print(f"Số chữ cái khác nhau: {len(chu_cai)}")

Bài tập 3: So sánh sở thích

python
# Sở thích của 2 người
so_thich_a = {"đọc sách", "xem phim", "nghe nhạc"}
so_thich_b = {"nghe nhạc", "chơi game", "đọc sách"}

chung = so_thich_a & so_thich_b
print(f"Sở thích chung: {chung}")

📋 Tóm tắt

Set vs List vs Tuple:

Đặc điểmSetListTuple
Trùng lặp❌ Không✅ Có✅ Có
Thứ tự❌ Không✅ Có✅ Có
Thay đổi✅ Có✅ Có❌ Không
Tìm kiếm⚡ Nhanh🐌 Chậm🐌 Chậm

Phép toán tập hợp:

Phép toánKý hiệuPhương thứcÝ nghĩa
Hợp|union()Tất cả phần tử
Giao&intersection()Phần tử chung
Hiệu-difference()Có trong A, không trong B

Khi nào dùng set:

  1. Loại bỏ trùng lặp: Từ list thành set
  2. Kiểm tra thành viên: in rất nhanh
  3. So sánh tập hợp: Tìm chung, khác biệt
  4. Lưu ID duy nhất: User ID, mã sản phẩm

Lưu ý quan trọng:

  1. Set rỗng: Dùng set() không dùng {}
  2. Không có index: Không thể set[0]
  3. Không có thứ tự: Thứ tự không cố định
  4. Chỉ hashable: Không chứa list, dict

Chuẩn bị cho bài tiếp theo:

Bài tiếp theo sẽ học về 🎯 Ứng dụng tuple và set trong thực tế!


💡 Mẹo: Dùng set để loại bỏ trùng lặp nhanh chóng!

🗂️ Thực hành: Thử tạo danh sách môn học không trùng lặp!

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