Bài tập luyện tập Set trong Python

Python Tutorial | by Hoc Python

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ấtkhô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ức add().

  • 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ức update().

  • Xóa số 30 khỏi Set bằng phương thức remove().

  • Thử xóa số 100 bằng remove() và xử lý lỗi KeyError một cách an toàn.

  • Xóa số 40 khỏi Set bằng phương thức discard().

  • Thử xóa số 200 bằng discard() 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}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}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ặplọ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.

Bài viết liên quan