Python Sets (Tập hợp trong Python)

1. Set là gì? (giải thích bằng tiếng Việt)

Set trong Python là:

  • Một tập hợp các phần tử không trùng lặp.
  • Không có thứ tự cố định (mỗi lần in ra có thể khác thứ tự).
  • Chứa được nhiều kiểu dữ liệu: số, chuỗi, boolean…
  • Nhanh trong kiểm tra xem một phần tử có nằm trong tập hay không.

So với List:

Thuộc tínhListSet
Cho phép giá trị trùng✔ Có✘ Không
Giữ nguyên thứ tự✔ Có✘ Không
Truy cập bằng index✔ Có✘ Không
Tốc độ kiểm tra membershipChậm hơnNhanh hơn

2. Example: Người dùng nhập danh sách có giá trị trùng lặp

Ví dụ người dùng nhập:

20, 40, 20

List sẽ chứa:

[20, 40, 20]

→ Khi chạy chương trình, bạn sẽ xử lý 20 hai lần, điều này có thể không mong muốn.

3. Chuyển List → Set để loại bỏ duplicates

Code minh họa

# Danh sách người dùng nhập, có giá trị trùng
list_of_days = [20, 40, 20]

print("Danh sách (list):", list_of_days)
print("Kiểu dữ liệu của list:", type(list_of_days))

# Chuyển thành set để loại bỏ trùng lặp
unique_days = set(list_of_days)

print("Tập hợp (set):", unique_days)
print("Kiểu dữ liệu của set:", type(unique_days))

Giải thích:

  • set(list_of_days) loại bỏ phần tử trùng → chỉ còn phần tử duy nhất.
  • List dùng dấu [ ]
  • Set dùng { }.

4. Tạo set thủ công

Code mẫu:

# Tạo set chứa tên các tháng
months = {"January", "February", "March"}

print(months)
print(type(months))

5. Duyệt phần tử trong Set (không có index)

Set không cho phép truy cập bằng index, ví dụ:

months[0]   # ❌ Sai — set không hỗ trợ index

➡ Thay vào đó, dùng vòng lặp:

Ví dụ:

months = {"January", "February", "March"}

for month in months:
    print("Tháng:", month)

6. Thêm phần tử vào Set bằng add()

Code:

months = {"January", "February", "March"}

months.add("April")   # Thêm tháng mới

print(months)

📝 Lưu ý:

  • Không thể thêm phần tử trùng → Python sẽ bỏ qua.

7. Xoá phần tử bằng remove()

Code:

months = {"January", "February", "March"}

months.remove("January")   # Xoá phần tử theo giá trị

print(months)

Lưu ý quan trọng:

  • Nếu phần tử KHÔNG tồn tại → remove() gây lỗi.
  • Với list, remove() chỉ xoá lần xuất hiện đầu tiên (vì list có thể có trùng).

8. Tính chất quan trọng của Set

Không có thứ tự (unordered)

Mỗi lần in ra set có thể ra thứ tự khác nhau:

days = {10, 45, 30, 10}  # 10 trùng sẽ bị loại bỏ

print(days)

Kết quả ví dụ:

{10, 30, 45}

Thứ tự không cố định — chạy lại sẽ khác.

9. Ví dụ tổng hợp — Xử lý danh sách ngày làm việc không trùng

Code hoàn chỉnh:

# Danh sách người dùng nhập
list_of_days = [10, 45, 30, 10]   # 10 nhập hai lần

print("List gốc:", list_of_days)

# Loại bỏ trùng lặp
unique_days = set(list_of_days)

print("Set loại trùng:", unique_days)

# Xử lý từng ngày một
for day in unique_days:
    print(f"Tính số giờ cho ngày: {day}")

Kết quả mong đợi:

  • 10 được xử lý chỉ một lần
  • Thứ tự in ra có thể thay đổi

10. Bài tập cho học viên

Bài 1

Người dùng nhập danh sách tên học sinh, có thể trùng.

Hãy dùng set để in ra danh sách tên duy nhất.

Bài 2

Tạo một set rỗng và cho phép người dùng nhập giá trị để thêm vào set bằng add().

Bài 3

Cho set:

colors = {"Red", "Green", "Blue"}
  • Thêm "Yellow"
  • Xoá "Green"
  • In kết quả