Set là một cấu trúc dữ liệu có thể thay đổi (mutable), do đó, bạn có thể thực hiện nhiều thao tác để quản lý các phần tử của nó. Dưới đây là các thao tác phổ biến nhất mà bạn sẽ sử dụng.
Thêm phần tử
my_set = {"apple", "banana"}
my_set.add("cherry")
print(f"Set sau khi add 'cherry': {my_set}")
# Output: Set sau khi add 'cherry': {'cherry', 'apple', 'banana'}
my_set.add("apple")
print(f"Set sau khi add 'apple' (đã tồn tại): {my_set}")
# Output: Set sau khi add 'apple' (đã tồn tại): {'cherry', 'apple', 'banana'}
update()
: Dùng để thêm nhiều phần tử từ một đối tượng có thể lặp (iterable) khác như List, Tuple, hoặc Set.
my_set = {"a", "b"}
another_list = ["c", "d", "a"]
my_set.update(another_list)
print(f"Set sau khi update từ list: {my_set}")
# Output: Set sau khi update từ list: {'c', 'b', 'd', 'a'}
Xóa phần tử
my_set = {"a", "b", "c"}
my_set.remove("b")
print(f"Set sau khi remove 'b': {my_set}")
# Output: Set sau khi remove 'b': {'a', 'c'}
try:
my_set.remove("d")
except KeyError as e:
print(f"Lỗi: {e}")
# Output: Lỗi: 'd'
discard()
: Xóa một phần tử cụ thể khỏi Set. Phương thức này tương tự như remove()
, nhưng nếu phần tử không tồn tại, nó sẽ không gây ra lỗi.
my_set = {"a", "b", "c"}
my_set.discard("c")
print(f"Set sau khi discard 'c': {my_set}")
# Output: Set sau khi discard 'c': {'a', 'b'}
my_set.discard("d")
print(f"Set sau khi discard 'd' (không tồn tại): {my_set}")
# Output: Set sau khi discard 'd' (không tồn tại): {'a', 'b'}
pop()
: Xóa và trả về một phần tử ngẫu nhiên khỏi Set. Vì Set không có thứ tự, bạn không thể biết trước phần tử nào sẽ bị xóa.
my_set = {"apple", "banana", "cherry"}
popped_element = my_set.pop()
print(f"Phần tử bị pop: {popped_element}")
print(f"Set sau khi pop: {my_set}")
# Output có thể khác nhau:
# Phần tử bị pop: banana
# Set sau khi pop: {'apple', 'cherry'}
clear()
: Xóa tất cả các phần tử, biến Set thành một Set rỗng.
my_set = {1, 2, 3}
my_set.clear()
print(f"Set sau khi clear: {my_set}")
# Output: Set sau khi clear: set()
Kiểm tra sự tồn tại
my_set = {"a", "b", "c"}
print(f"Kiểm tra 'b' có trong set không? {'b' in my_set}")
# Output: Kiểm tra 'b' có trong set không? True
print(f"Kiểm tra 'd' có trong set không? {'d' in my_set}")
# Output: Kiểm tra 'd' có trong set không? False
Các phép toán tập hợp (Set Operations)
Set được thiết kế đặc biệt để thực hiện các phép toán tập hợp trong toán học.
Hợp (Union): Kết hợp tất cả các phần tử từ hai Set.
Ví dụ:
set1 = {1, 2, 3}
set2 = {3, 4, 5}
union_set = set1.union(set2)
print(f"Phép hợp: {union_set}")
# Output: Phép hợp: {1, 2, 3, 4, 5}
Giao (Intersection): Trả về các phần tử chung của hai Set.
Ví dụ:
set1 = {1, 2, 3}
set2 = {3, 4, 5}
intersection_set = set1.intersection(set2)
print(f"Phép giao: {intersection_set}")
# Output: Phép giao: {3}
Hiệu (Difference): Trả về các phần tử chỉ có trong Set thứ nhất mà không có trong Set thứ hai.
Ví dụ:
set1 = {1, 2, 3}
set2 = {3, 4, 5}
difference_set = set1.difference(set2)
print(f"Phép hiệu (set1 - set2): {difference_set}")
# Output: Phép hiệu (set1 - set2): {1, 2}
Hiệu đối xứng (Symmetric Difference): Trả về các phần tử có trong một trong hai Set, nhưng không có trong cả hai.
Ví dụ:
set1 = {1, 2, 3}
set2 = {3, 4, 5}
symmetric_diff_set = set1.symmetric_difference(set2)
print(f"Hiệu đối xứng: {symmetric_diff_set}")
# Output: Hiệu đối xứng: {1, 2, 4, 5}
Kiểm tra tập con/tập cha:
Ví dụ:
set1 = {1, 2}
set2 = {1, 2, 3}
print(f"set1 có phải là tập con của set2 không? {set1.issubset(set2)}")
# Output: set1 có phải là tập con của set2 không? True
print(f"set2 có phải là tập cha của set1 không? {set2.issuperset(set1)}")
# Output: set2 có phải là tập cha của set1 không? True
Các hàm tích hợp sẵn (Built-in Functions) thường dùng với Set trong Python
Ngoài các phương thức (methods) riêng của Set, bạn cũng có thể sử dụng nhiều hàm tích hợp sẵn (built-in functions) của Python để thao tác và phân tích dữ liệu trong Set. Các hàm này không phải là phương thức của Set mà là các hàm chung của Python có thể hoạt động với nhiều loại iterable (đối tượng có thể lặp), bao gồm cả Set.
Dưới đây là một số hàm built-in phổ biến và hữu ích khi làm việc với Set:
len()
Ví dụ minh họa:
my_set = {"apple", "banana", "cherry"}
print(f"Set: {my_set}")
# Lấy độ dài của Set
set_length = len(my_set)
print(f"Số lượng phần tử trong Set: {set_length}") # Output: Số lượng phần tử trong Set: 3
empty_set = set()
print(f"Độ dài của Set rỗng: {len(empty_set)}") # Output: Độ dài của Set rỗng: 0
min()
và max()
Khái niệm:
-
Hàm min()
trả về phần tử có giá trị nhỏ nhất.
-
Hàm max()
trả về phần tử có giá trị lớn nhất.
-
Lưu ý quan trọng: Các hàm này chỉ hoạt động nếu tất cả các phần tử trong Set có thể so sánh được với nhau (ví dụ: tất cả là số, hoặc tất cả là chuỗi). Bạn không thể tìm min()
hoặc max()
của một Set chứa hỗn hợp các kiểu dữ liệu không thể so sánh.
-
Cú pháp: min(ten_set)
và max(ten_set)
Ví dụ minh họa:
scores = {85, 92, 78, 95, 88}
print(f"Set điểm số: {scores}")
# Tìm điểm số cao nhất và thấp nhất
highest_score = max(scores)
lowest_score = min(scores)
print(f"Điểm số cao nhất: {highest_score}") # Output: Điểm số cao nhất: 95
print(f"Điểm số thấp nhất: {lowest_score}") # Output: Điểm số thấp nhất: 78
sum()
Khái niệm: Hàm sum()
trả về tổng của tất cả các phần tử trong Set.
Lưu ý quan trọng: Hàm này chỉ hoạt động với Set chứa các giá trị số (integers, floats, v.v.).
Cú pháp: sum(ten_set)
Ví dụ minh họa:
sales_figures = {100, 250, 150, 300}
print(f"Set doanh số: {sales_figures}")
# Tính tổng doanh số
total_sales = sum(sales_figures)
print(f"Tổng doanh số: {total_sales}") # Output: Tổng doanh số: 800
sorted()
Khái niệm: Hàm sorted()
tạo và trả về một List mới chứa tất cả các phần tử của Set đã được sắp xếp theo thứ tự tăng dần (mặc định). Set gốc không bị thay đổi.
Lưu ý quan trọng:
-
Giống như min()
và max()
, các phần tử trong Set phải có thể so sánh được với nhau.
-
Hàm này luôn trả về một List, không phải một Set, vì Set không có thứ tự.
Cú pháp: sorted(ten_set, reverse=False)
Ví dụ minh họa:
unsorted_numbers = {3, 1, 4, 1, 5, 9, 2}
print(f"Set chưa sắp xếp: {unsorted_numbers}")
# Sắp xếp Set và nhận về một List mới
sorted_list_asc = sorted(unsorted_numbers)
print(f"Set đã sắp xếp (dưới dạng List): {sorted_list_asc}")
# Output: Set đã sắp xếp (dưới dạng List): [1, 2, 3, 4, 5, 9]
# Sắp xếp giảm dần
sorted_list_desc = sorted(unsorted_numbers, reverse=True)
print(f"List đã sắp xếp giảm dần: {sorted_list_desc}")
# Output: List đã sắp xếp giảm dần: [9, 5, 4, 3, 2, 1]
# Set gốc vẫn không thay đổi
print(f"Set gốc sau khi sắp xếp: {unsorted_numbers}")
# Output: Set gốc sau khi sắp xếp: {1, 2, 3, 4, 5, 9}
Các hàm tích hợp sẵn này là những công cụ mạnh mẽ để phân tích và trích xuất thông tin từ Set một cách hiệu quả, giúp bạn làm việc dễ dàng hơn với cấu trúc dữ liệu độc đáo này.
Kết bài
Set là một công cụ hữu ích để giải quyết những bài toán đặc thù. Việc lựa chọn đúng cấu trúc dữ liệu (List
, Tuple
, Set
hay Dictionary
) ngay từ đầu là một kỹ năng quan trọng giúp bạn viết code hiệu quả và dễ bảo trì hơn. Hãy luôn xem xét tính chất của dữ liệu và yêu cầu của bài toán để đưa ra quyết định phù hợp nhất.