Lesson 11: Sets (Tập hợp)

🎯 Mục Tiêu

  • Khái niệm về Set, phân biệt với List và Tuple.
  • Hiểu đặc điểm: không thứ tự (unordered), không trùng lặp (unique elements).
  • Cách sử dụng và thao tác thêm/xóa phần tử.
  • Các phép toán với tính chất “tập hợp” (hợp, giao, hiệu, khác biệt đối xứng).

Khởi Tạo Set (Creating Sets)

Set là tập hợp các phần tử, sử dụng dấu ngoặc nhọn {} giống Dictionary nhưng chỉ chứa các giá trị độc lập, không phải cặp dạng “key: value”. Set tự động LOẠI BỎ CÁC GIÁ TRỊ TRÙNG LẶP ngay khi khai báo.

# Tạo set thông thường
numbers = {1, 2, 3, 4, 5}

# Set TỰ ĐỘNG bỏ phần tử bị lặp lại
nums = {1, 1, 2, 2, 3}  # Kết quả thực tế lưu là: {1, 2, 3}

# TẠO MỘT SET RỖNG
# ❌ LƯU Ý: Không dùng dấu = {} (đây là cách để tạo Dictionary rỗng)
# ✅ Cú pháp chuẩn phải là set()
empty_set = set()

Thêm và Xóa Phần Tử (Adding & Removing)

Khác với Tuple, Set là mutable (có thể thay đổi), nên bạn có thể thêm bớt phần tử bình thường. Set không có thứ tự, vì vậy KHÔNG THỂ truy cập Set qua index (numbers[0] sẽ báo lỗi).

s = {1, 2, 3}

# Thêm 1 phần tử
s.add(4)
print(s) # {1, 2, 3, 4}

# Xóa 1 phần tử bằng remove()
# (NẾU phẩn tử không tồn tại, nó sẽ quăng lỗi KeyError)
s.remove(2)

# Xóa bằng discard() - AN TOÀN HƠN
# (NẾU phần tử không tồn tại thì tự bỏ qua, KHÔNG văng lỗi)
s.discard(10)

# Cập nhật bằng nhiều phần tử 
s.update({5, 6, 7}) # Dùng tuple, list hay set khác đều được

Operations Toán Tập Hợp (Set Operations)

Sức mạnh thực sự của Set nằm ở chỗ nó cung cấp các phép toán mang tính chất của Toán Học Tập Hợp rất cực kỳ nhanh chóng.

a = {1, 2, 3, 4}
b = {3, 4, 5, 6}

# UNION (Phép Hợp) - Ký hiệu: |
# Lấy tất cả các phần tử của cả hai set nhưng chỉ giữ lại 1 bản copy không trùng.
print(a | b)  # {1, 2, 3, 4, 5, 6}

# INTERSECTION (Phép Giao/Chung) - Ký hiệu: &
# Chỉ tìm những phần tử có TỒN TẠI ở cả set a và set b.
print(a & b)  # {3, 4}

# DIFFERENCE (Phép Hiệu/Khoảng Cách) - Ký hiệu: -
# Lấy các phần tử CHỈ CÓ thuộc `a` MÀ KHÔNG thuộc `b`.
print(a - b)  # {1, 2}

# SYMMETRIC DIFFERENCE (Khác biệt đối xứng) - Ký hiệu: ^
# Lấy các phần tử thuộc `a` hoặc `b` NHƯNG KHÔNG BAO GỒM phần giao (không chung ở 2 nơi).
print(a ^ b)  # {1, 2, 5, 6}

Check Membership (Kiểm tra phần tử)

Việc kiểm tra một phần tử có nằm trong bộ data hay không khi dùng Set (toán tử in / not in) thường nhanh hơn đáng kể so với việc dò trong List, nhờ vào cơ chế Hashing ngầm định bên dưới.

vowels = {"a", "e", "i", "o", "u"}

if "o" in vowels:
    print("Có ký tự o")

if "x" not in vowels:
    print("Không có từ này")

💡 Key Takeaways

  • Không thể truy cập Set qua chỉ số vị trí index.
  • Thích hợp nhất cho bài toán: Loại bỏ dữ liệu bị trùng lặp bằng cách gọi lệnh ép kiểu set(your_list).
  • Rất nhanh cho các lệnh kiểm tra membership (item in collection).
  • Hoàn toàn hiệu quả khi làm các phép tính thống kê dữ liệu giữa 2 bên ứng dụng (Phép giao, khoảng cách,…).

➡️ Bài Tiếp Theo Lesson 12 – Dictionaries

Leave a Reply

Your email address will not be published. Required fields are marked *