Chủ đề: Set trong Python¶
I. Lý thuyết¶
1. Định nghĩa¶
Set (tập hợp) là một kiểu dữ liệu trong Python dùng để lưu trữ các giá trị không trùng lặp và không có thứ tự xác định.
2. Đặc điểm của Set¶
- Không chứa phần tử trùng lặp.
- Không có thứ tự (unordered).
- Không thể truy cập phần tử bằng chỉ số.
- Có thể thêm và xóa phần tử.
- Mỗi phần tử là kiểu dữ liệu không thay đổi (immutable).
3. Khai báo Set¶
Cách 1: Sử dụng dấu ngoặc nhọn {}
Cách 2: Dùng hàm set()
a = {1, 2, 3}
b = set([4, 5, 6])
Khai báo Set rỗng set()
a = set()
II. Các thao tác với Set¶
1. Thêm phần tử¶
a = {1, 2}
a.add(3)
2. Xóa phần tử¶
a = {1, 2, 3}
a.remove(2) # Xóa phần tử 2 (báo lỗi nếu không tồn tại)
a.discard(5) # Xóa phần tử 5 (không báo lỗi nếu không có)
# Xóa ngẫu nhiên một phần tử
a = {1, 2, 3, 4, 5}
phan_tu_ngau_nhien = a.pop() # Xóa và trả về một phần tử ngẫu nhiên
print(f"Đã xóa phần tử: {phan_tu_ngau_nhien}")
print(f"Set còn lại: {a}")
# Xóa toàn bộ phần tử
a.clear() # Xóa tất cả phần tử trong Set
print(a) # Kết quả: set()
3. Duyệt Set¶
a = {1, 2, 3}
for x in a:
print(x)
4. Các phép toán tập hợp¶
Giả sử:
a = {1, 2, 3}
b = {3, 4, 5}
Tên phép toán | Cách viết | Kết quả |
---|---|---|
Hợp (Union) | a | b hoặc a.union(b) |
{1, 2, 3, 4, 5} |
Giao (Intersection) | a & b hoặc a.intersection(b) |
{3} |
Hiệu (Difference) | a - b hoặc a.difference(b) |
{1, 2} |
Phần bù đối xứng | a ^ b hoặc a.symmetric_difference(b) |
{1, 2, 4, 5} |
III. Ví dụ minh họa¶
Ví dụ 1: Tạo Set và loại bỏ phần tử trùng¶
mon_hoc = {"Toán", "Lý", "Hóa", "Toán"}
print(mon_hoc)
Ví dụ 2: Kiểm tra phần tử có trong Set hay không¶
mon_hoc = {"Toán", "Lý", "Hóa"}
if "Toán" in mon_hoc:
print("Có học Toán")
Ví dụ 3: Thêm phần tử mới vào Set¶
mon_hoc = {"Toán", "Lý"}
mon_hoc.add("Sinh")
print(mon_hoc)
Ví dụ 4: Phép toán giao¶
a = {1, 2, 3}
b = {2, 3, 4}
print(a & b)
IV. Bài tập vận dụng tại lớp¶
Bài 1: Quản lý môn học yêu thích¶
Đề bài: Tạo một Set chứa các tên môn học yêu thích. Thực hiện:
- Thêm một môn học mới.
- Xóa một môn học.
- In toàn bộ môn học còn lại.
💡 Phân tích đề
Các bước thực hiện:
- Tạo Set chứa các môn học ban đầu
- Sử dụng add() để thêm môn học mới
- Sử dụng discard() để xóa môn học (an toàn hơn remove())
- In Set kết quả (không có thứ tự cố định)
Input/Output mẫu:
Thao tác | Set ban đầu | Thao tác | Set kết quả |
---|---|---|---|
Tạo Set | {"Toán", "Tin học", "Anh"} |
3 môn học |
|
Thêm | add("Văn") |
{"Toán", "Tin học", "Anh", "Văn"} |
|
Xóa | discard("Anh") |
{"Toán", "Tin học", "Văn"} |
💡 Gợi ý code
# Tạo Set môn học yêu thích
mon_yeu_thich = {"Toán", "Tin học", "Anh"}
# Thêm môn học mới
mon_yeu_thich.add("Văn")
# Xóa một môn học
mon_yeu_thich.discard("Anh")
# In kết quả
print(mon_yeu_thich)
Bài 2: Phép toán tập hợp¶
Đề bài: Cho hai Set sau:
lop_a = {"An", "Bình", "Cường", "Duy"}
lop_b = {"Bình", "Duy", "Hà", "Khánh"}
Thực hiện:
- Tìm học sinh có mặt ở cả hai lớp.
- Tìm học sinh chỉ có ở lớp A.
- Tìm học sinh có ở một trong hai lớp nhưng không có mặt ở cả hai.
💡 Phân tích đề
Các bước thực hiện:
- Sử dụng phép giao (&) để tìm phần tử chung
- Sử dụng phép hiệu (-) để tìm phần tử chỉ có ở lớp A
- Sử dụng phép hiệu đối xứng (^) cho phần tử ở một trong hai
- In kết quả từng phép toán
Input/Output mẫu:
Phép toán | Ký hiệu | Kết quả |
---|---|---|
Giao | lop_a & lop_b |
{"Bình", "Duy"} |
Hiệu | lop_a - lop_b |
{"An", "Cường"} |
Hiệu đối xứng | lop_a ^ lop_b |
{"An", "Cường", "Hà", "Khánh"} |
💡 Gợi ý code
# Hai Set lớp học
lop_a = {"An", "Bình", "Cường", "Duy"}
lop_b = {"Bình", "Duy", "Hà", "Khánh"}
# Phép giao - có ở cả hai lớp
ca_hai_lop = lop_a & lop_b
# Phép hiệu - chỉ có ở lớp A
chi_lop_a = lop_a - lop_b
# Hiệu đối xứng - chỉ có ở một trong hai
chi_mot_trong_hai = lop_a ^ lop_b
# In kết quả
print("Cả hai lớp:", ca_hai_lop)
print("Chỉ lớp A:", chi_lop_a)
print("Chỉ một trong hai:", chi_mot_trong_hai)
V. Bài tập về nhà¶
Bài 1: Xử lý danh sách trùng lặp¶
Đề bài: Viết chương trình nhập vào hai danh sách tên học sinh (dạng list), chuyển thành Set và thực hiện:
- Loại bỏ tên trùng lặp.
- Tìm tên có ở cả hai danh sách.
- In ra tên chỉ có ở danh sách thứ nhất.
💡 Phân tích đề
Các bước thực hiện:
- Nhập hai danh sách tên học sinh dạng list
- Chuyển list thành set để tự động loại bỏ trùng lặp
- Sử dụng phép giao (&) để tìm tên chung
- Sử dụng phép hiệu (-) để tìm tên chỉ có ở danh sách đầu
- In kết quả từng bước xử lý
Input/Output mẫu:
Danh sách 1 | Danh sách 2 | Chung | Chỉ danh sách 1 |
---|---|---|---|
["An", "Bình", "An", "Cường"] |
["Bình", "Duy", "Bình"] |
{"Bình"} |
{"An", "Cường"} |
Bài 2: Lọc số chẵn trong Set¶
Đề bài: Tạo Set chứa các số từ 1 đến 10. Xóa tất cả các số chẵn khỏi Set và in ra kết quả.
💡 Phân tích đề
Các bước thực hiện:
- Tạo Set chứa số từ 1 đến 10 bằng range()
- Duyệt qua các phần tử trong Set
- Tìm các số chẵn (số % 2 == 0)
- Xóa các số chẵn khỏi Set
- In Set kết quả chỉ chứa số lẻ
Input/Output mẫu:
Set ban đầu | Số chẵn cần xóa | Set kết quả |
---|---|---|
{1,2,3,4,5,6,7,8,9,10} |
{2,4,6,8,10} |
{1,3,5,7,9} |
VI. Ghi chú¶
- Set dùng tốt khi cần kiểm tra phần tử trùng và xử lý tập hợp.
- Không sử dụng Set nếu cần giữ thứ tự hoặc cần truy cập theo chỉ số.