Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.
Sự khác biệt giữa set() và frozenset() trong Python
Trong Python, hai hàm có sẵn là set()
và frozenset()
cung cấp cách tạo các tập hợp (sets) với những đặc điểm riêng biệt. Mặc dù cả hai đều cho phép lưu trữ các phần tử không trùng lặp, set()
hỗ trợ tính năng thay đổi (mutable), trong khi frozenset()
là dạng tập hợp cố định (immutable). Việc hiểu sự khác biệt giữa set()
và frozenset()
sẽ giúp bạn chọn lựa công cụ phù hợp tùy theo nhu cầu xử lý dữ liệu.
Set() trong Python
Set
là một tập hợp không có thứ tự và không được đánh chỉ mục của các phần tử duy nhất. Set
là mutable (có thể thay đổi), tức là bạn có thể thay đổi các phần tử của nó bằng các hàm như add()
, remove()
, v.v. Vì các phần tử có thể thay đổi và không có thứ tự, nên chúng không có giá trị hash, do đó bạn không thể truy cập phần tử bằng chỉ mục.
Lưu ý: Set
không thể được sử dụng làm key trong dictionary hoặc làm phần tử của một set khác nhưng có thể được dùng làm giá trị trong dictionary.
Một set
được biểu diễn bằng cặp ngoặc nhọn {}
hoặc sử dụng set()
. Nếu bạn dùng {}
mà không có phần tử nào, Python sẽ tạo ra một dictionary thay vì set. Để tạo một set rỗng, bạn cần sử dụng set()
.
Bài viết này được đăng tại [free tuts .net]
Các ví dụ thao tác trên set
:
fruits = {"Apple", "Banana", "Cherry", "Apple", "Kiwi"} print('Các phần tử duy nhất:', fruits) # Thêm phần tử mới fruits.add("Orange") print('Sau khi thêm phần tử mới:', fruits) # Kích thước của set print('Kích thước của set:', len(fruits)) # Kiểm tra sự tồn tại của phần tử trong set print('Apple có trong set:', "Apple" in fruits) print('Mango có trong set:', "Mango" in fruits) # Xóa phần tử khỏi set fruits.remove("Mango") print('Sau khi xóa phần tử:', fruits) # Loại bỏ phần tử khỏi set (nếu không tồn tại sẽ không báo lỗi) fruits.discard("Mango") print('Sau khi loại bỏ phần tử:', fruits)
Kết quả:
Các phần tử duy nhất: {'Kiwi', 'Apple', 'Cherry', 'Banana'} Sau khi thêm phần tử mới: {'Kiwi', 'Orange', 'Banana', 'Apple', 'Cherry'} Kích thước của set: 5 Apple có trong set: True Mango có trong set: False Traceback (most recent call last): ... KeyError: 'Mango'
Ở đây, remove()
sẽ tạo ra lỗi nếu phần tử không có trong set, trong khi discard()
sẽ không báo lỗi.
Frozenset() trong Python
Frozenset
cũng là một tập hợp không có thứ tự và không đánh chỉ mục của các phần tử duy nhất. Tuy nhiên, frozenset
là immutable (bất biến), nghĩa là bạn không thể thay đổi các phần tử của nó sau khi tạo.
Frozenset
có thể được sử dụng làm key trong dictionary hoặc là phần tử của một set
khác vì nó có thể hash được. Để tạo frozenset
, bạn sử dụng hàm frozenset()
.
Ví dụ về frozenset
:
fruits = {"Apple", "Banana", "Cherry", "Apple", "Kiwi"} basket = frozenset(fruits) print('Các phần tử duy nhất:', basket) # Thử thêm phần tử mới sẽ gây lỗi basket.add("Orange") print('Sau khi thêm phần tử mới:', basket)
Kết quả:
Các phần tử duy nhất: frozenset({'Kiwi', 'Cherry', 'Apple', 'Banana'}) Traceback (most recent call last): ... AttributeError: 'frozenset' object has no attribute 'add'
So sánh Set và Frozenset qua ví dụ
# Tạo frozenset từ dictionary student = {"Name": "John", "Age": "25", "Gender": "Male"} key = frozenset(student) print("Các key là:", key)
Kết quả:
Các key là: frozenset({'Age', 'Name', 'Gender'})
Các thao tác khác trên Frozenset và Set
numbers1 = frozenset([1, 2, 3, 4, 5]) numbers2 = frozenset([2, 3, 4, 5]) # Hợp cả hai tập hợp combined = numbers1 | numbers2 print("Hợp của hai tập hợp:", combined) # Chọn các phần tử chung intersect = numbers1 & numbers2 print("Phần tử chung:", intersect) # Lấy các phần tử không chung difference = numbers1 - numbers2 print("Phần tử khác biệt:", difference) # Kiểm tra quan hệ print("Disjoint:", numbers1.isdisjoint(numbers2)) print("Subset:", numbers1.issubset(numbers2)) print("Superset:", numbers1.issuperset(numbers2))
Kết quả:
Hợp của hai tập hợp: frozenset({1, 2, 3, 4, 5}) Phần tử chung: frozenset({2, 3, 4, 5}) Phần tử khác biệt: frozenset({1}) Disjoint: False Subset: False Superset: True
Kết bài
Mình vừa tìm hiểu về set
và frozenset
trong Python cũng như các thao tác có thể thực hiện trên chúng. Set
phù hợp với các tình huống cần thay đổi dữ liệu, trong khi frozenset
là lựa chọn tốt khi cần tập hợp bất biến.