Bài tập luyện tập Set trong Python
Python Tutorial | by
Việc học lý thuyết là rất quan trọng, nhưng để thực sự làm chủ một khái niệm, bạn cần phải thực hành. Set, với những đặc điểm độc đáo như các phần tử duy nhất và không có thứ tự, là một cấu trúc dữ liệu mạnh mẽ nhưng cũng đòi hỏi bạn phải làm quen với cách sử dụng nó. Bài viết này tổng hợp các bài tập thực hành được thiết kế để củng cố kiến thức của bạn về Set, từ những thao tác cơ bản nhất như thêm/xóa phần tử cho đến các phép toán tập hợp phức tạp hơn. Hãy cùng bắt tay vào luyện tập để biến lý thuyết thành kỹ năng thực tế nhé!
Bài tập 1: Khởi tạo, Thêm và Xóa phần tử cơ bản
Yêu cầu: Bạn cần thực hiện một chuỗi các thao tác cơ bản trên một Set. In Set ra sau mỗi bước để thấy kết quả thay đổi như thế nào.
-
Tạo một Set rỗng có tên
my_numbers
. -
Thêm các số
10, 20, 30
vào Set bằng phương thứcadd()
. -
Thử thêm số
20
một lần nữa và quan sát. -
Thêm các số
40, 50, 10
vào Set từ một List bằng phương thứcupdate()
. -
Xóa số
30
khỏi Set bằng phương thứcremove()
. -
Thử xóa số
100
bằngremove()
và xử lý lỗiKeyError
một cách an toàn. -
Xóa số
40
khỏi Set bằng phương thứcdiscard()
. -
Thử xóa số
200
bằngdiscard()
và quan sát. -
Sử dụng phương thức
pop()
để lấy và in ra một phần tử ngẫu nhiên. -
Xóa tất cả các phần tử còn lại bằng phương thức
clear()
.
Đáp án:
print("--- Bài tập 1: Khởi tạo, Thêm và Xóa ---") # 1. Tạo Set rỗng my_numbers = set() print(f"1. Set rỗng ban đầu: {my_numbers}") # 2. Thêm các số 10, 20, 30 my_numbers.add(10) my_numbers.add(20) my_numbers.add(30) print(f"2. Sau khi dùng add() 3 lần: {my_numbers}") # Output: {10, 20, 30} # 3. Thử thêm lại số 20 my_numbers.add(20) print(f"3. Thử thêm lại số 20: {my_numbers}") # Output: {10, 20, 30} -> Không thay đổi vì 20 đã tồn tại # 4. Thêm các số 40, 50, 10 bằng update() my_numbers.update([40, 50, 10]) print(f"4. Sau khi dùng update() với list [40, 50, 10]: {my_numbers}") # Output: {50, 10, 20, 40, 30} -> 10 đã có nên không được thêm lại # 5. Xóa số 30 bằng remove() my_numbers.remove(30) print(f"5. Sau khi remove(30): {my_numbers}") # Output: {50, 10, 20, 40} # 6. Thử xóa số 100 bằng remove() và xử lý lỗi try: my_numbers.remove(100) except KeyError as e: print(f"6. Lỗi: {e} - Không tìm thấy 100 để xóa.") # Output: Lỗi: 100 - Không tìm thấy 100 để xóa. # 7. Xóa số 40 bằng discard() my_numbers.discard(40) print(f"7. Sau khi discard(40): {my_numbers}") # Output: {50, 10, 20} # 8. Thử xóa số 200 bằng discard() my_numbers.discard(200) print(f"8. Thử discard(200): {my_numbers}") # Output: {50, 10, 20} -> Không có lỗi xảy ra, Set không đổi # 9. Dùng pop() để lấy và in ra một phần tử ngẫu nhiên popped_item = my_numbers.pop() print(f"9. Phần tử đã bị pop: {popped_item}") print(f" Set còn lại: {my_numbers}") # Output: (Kết quả pop() có thể khác nhau) # Phần tử đã bị pop: 50 # Set còn lại: {10, 20} # 10. Xóa tất cả các phần tử còn lại bằng clear() my_numbers.clear() print(f"10. Sau khi clear(): {my_numbers}") # Output: set()
Bài tập 2: Phép toán Tập hợp (Tạo Set mới)
Yêu cầu: Cho hai Set set_a = {1, 2, 3, 4, 5}
và set_b = {4, 5, 6, 7, 8}
. Hãy thực hiện các phép toán Hợp, Giao, Hiệu, Hiệu đối xứng và in kết quả.
Đáp án:
print("\n--- Bài tập 2: Phép toán Tập hợp ---") set_a = {1, 2, 3, 4, 5} set_b = {4, 5, 6, 7, 8} # Phép Hợp (Union) set_union = set_a.union(set_b) print(f"Phép hợp (A union B): {set_union}") # Output: {1, 2, 3, 4, 5, 6, 7, 8} # Phép Giao (Intersection) set_intersection = set_a.intersection(set_b) print(f"Phép giao (A intersection B): {set_intersection}") # Output: {4, 5} # Phép Hiệu (Difference) set_difference = set_a.difference(set_b) print(f"Phép hiệu (A difference B): {set_difference}") # Output: {1, 2, 3} # Phép Hiệu đối xứng (Symmetric Difference) set_sym_diff = set_a.symmetric_difference(set_b) print(f"Phép hiệu đối xứng (A symmetric_difference B): {set_sym_diff}") # Output: {1, 2, 3, 6, 7, 8} # Kiểm tra Set gốc không đổi print(f"\nSet A gốc: {set_a}") # Output: {1, 2, 3, 4, 5} print(f"Set B gốc: {set_b}") # Output: {4, 5, 6, 7, 8}
Bài tập 3: Kiểm tra Mối quan hệ giữa các Set
Yêu cầu: Sử dụng các Set dưới đây để kiểm tra mối quan hệ giữa chúng bằng issubset()
, issuperset()
, và isdisjoint()
.
-
set_all_students = {"An", "Binh", "Cuong", "Dung", "Thao"}
-
set_club_members = {"An", "Cuong"}
-
set_new_students = {"Hung", "Linh"}
Đáp án:
print("\n--- Bài tập 3: Kiểm tra Mối quan hệ ---") set_all_students = {"An", "Binh", "Cuong", "Dung", "Thao"} set_club_members = {"An", "Cuong"} set_new_students = {"Hung", "Linh"} # issubset(): Set này có phải là tập con của Set kia không? is_subset = set_club_members.issubset(set_all_students) print(f"set_club_members có phải là tập con của set_all_students không? {is_subset}") # Output: True # issuperset(): Set này có phải là tập cha của Set kia không? is_superset = set_all_students.issuperset(set_club_members) print(f"set_all_students có phải là tập cha của set_club_members không? {is_superset}") # Output: True # isdisjoint(): Hai Set có rời nhau (không có phần tử chung) không? is_disjoint = set_new_students.isdisjoint(set_all_students) print(f"set_new_students và set_all_students có rời nhau không? {is_disjoint}") # Output: True
Bài tập 4: Cập nhật Set tại chỗ
Yêu cầu: Cho hai Set set_a = {1, 2, 3, 4, 5}
và set_b = {4, 5, 6, 7, 8}
. Sử dụng các phương thức cập nhật tại chỗ để thay đổi nội dung của set_a
theo các phép toán.
Đáp án:
print("\n--- Bài tập 4: Cập nhật Set tại chỗ ---") # 1. intersection_update() set_a = {1, 2, 3, 4, 5} set_b = {4, 5, 6, 7, 8} print(f"Set A ban đầu: {set_a}") set_a.intersection_update(set_b) # Cập nhật A chỉ với các phần tử chung print(f"Set A sau khi cập nhật giao (intersection_update): {set_a}") # Output: {4, 5} # 2. difference_update() set_a = {1, 2, 3, 4, 5} set_b = {4, 5, 6, 7, 8} print(f"\nSet A ban đầu: {set_a}") set_a.difference_update(set_b) # Cập nhật A bằng cách xóa các phần tử có trong B print(f"Set A sau khi cập nhật hiệu (difference_update): {set_a}") # Output: {1, 2, 3} # 3. symmetric_difference_update() set_a = {1, 2, 3, 4, 5} set_b = {4, 5, 6, 7, 8} print(f"\nSet A ban đầu: {set_a}") set_a.symmetric_difference_update(set_b) # Cập nhật A với kết quả hiệu đối xứng print(f"Set A sau khi cập nhật hiệu đối xứng (symmetric_difference_update): {set_a}") # Output: {1, 2, 3, 6, 7, 8}
Bài tập 5: Ứng dụng thực tế (Loại bỏ trùng lặp và Lọc dữ liệu)
Yêu cầu: Sử dụng Set để giải quyết hai bài toán phổ biến: loại bỏ trùng lặp từ một List và lọc dữ liệu giữa hai danh sách.
Đáp án:
print("\n--- Bài tập 5: Ứng dụng thực tế ---") # Bài toán 1: Loại bỏ trùng lặp favorite_dishes = ["Phở", "Bún chả", "Nem rán", "Phở", "Bánh mì", "Bún chả"] # Cách đơn giản nhất để loại bỏ trùng lặp là chuyển List sang Set unique_dishes = set(favorite_dishes) print(f"1. Danh sách các món ăn duy nhất: {unique_dishes}") # Output: {'Nem rán', 'Bún chả', 'Bánh mì', 'Phở'} # Bài toán 2: Lọc dữ liệu all_students = ["Alice", "Bob", "Charlie", "David", "Eve"] enrolled_in_math = ["Alice", "Charlie", "Frank"] # Chuyển List thành Set để tận dụng các phép toán tập hợp set_all = set(all_students) set_math = set(enrolled_in_math) # Tìm những học sinh chỉ có trong danh sách chung mà không học Toán students_not_in_math = set_all - set_math # Phép hiệu print(f"2. Học sinh chỉ có trong danh sách chung, không học Toán: {students_not_in_math}") # Output: {'Bob', 'David', 'Eve'} # Tìm những học sinh tham gia cả hai danh sách students_in_both = set_all & set_math # Phép giao print(f"3. Học sinh tham gia cả hai danh sách: {students_in_both}") # Output: {'Alice', 'Charlie'}
Kết bài
Quá trình này đã giúp bạn củng cố kiến thức lý thuyết bằng cách áp dụng chúng vào các tình huống cụ thể.
Qua các bài tập, bạn đã:
-
Làm quen với các thao tác cơ bản như thêm, xóa, và cập nhật phần tử.
-
Thực hiện thành thạo các phép toán tập hợp như hợp, giao, hiệu và hiệu đối xứng.
-
Biết cách sử dụng Set để giải quyết các bài toán thực tế như loại bỏ trùng lặp và lọc dữ liệu.
Lời khuyên cuối cùng:
Hãy tiếp tục luyện tập để biến Set thành một công cụ quen thuộc của bạn. Khi gặp một bài toán cần xử lý các tập hợp dữ liệu hoặc cần loại bỏ các phần tử trùng lặp, hãy nghĩ ngay đến Set. Nó không chỉ giúp code của bạn ngắn gọn, dễ đọc mà còn cực kỳ hiệu quả về mặt hiệu suất.