Bài 25. Dữ liệu kiểu set
Set là một tập hợp các phần tử không có thứ tự. Mọi phần tử trong set là duy nhất (không trùng lặp) và bất biến (không thể thay đổi). Phần tử của set có thể có kiểu dữ liệu bất kỳ trừ list và chính nó.

Khởi tạo set

1
s1 = set([1,2,3,4])
2
s2 = {3, 4, 5}
3
print(s1)
4
print(s2)
5
6
ms = {1.0, "Hello", (1, 2, 3)}
7
print(ms)
Copied!
Xét thêm các ví dụ sau để thấy set không chứa phần tử trùng lặp.
1
s = {1, 2, 3, 4, 3, 2}
2
print(s) # Output chỉ còn: {1, 2, 3, 4}
3
4
s = set([1, 2, 3, 2])
5
print(s) # {1, 2, 3}
Copied!
Lưu ý: Ta không thể khởi tạo một set rỗng như cách làm với list và tuple. Ví dụ:
1
s = {}
2
print(s)
3
print(type(s)) # <class 'dict'> - lúc này Python nhận kiểu dict
4
5
s = set({})
6
print(s)
7
print(type(s)) # <class 'set'>
Copied!

Thêm, sửa, xóa phần tử set

Thêm

1
s = {1, 3}
2
print(s)
3
4
# s[0] # bỏ comment dòng 4 này sẽ phát sinh lỗi
5
#vì set không cho truy cập theo chỉ số
6
7
s.add(2)
8
print(s) # {1, 2, 3}
9
10
s.update([2, 3, 4])
11
print(s) # Output: {1, 2, 3, 4}
12
13
s.update([4, 5], {1, 6, 8})
14
print(s) # Output: {1, 2, 3, 4, 5, 6, 8}
Copied!

Xóa

Sử dụng phương thức discard() và remove(). Lưu ý phương thức remove() sẽ không hoạt động nếu phần tử chỉ định không tồn tại trong set.
1
s2 = {1, 3, 4, 5, 6}
2
3
s2.discard(4) # xóa bỏ một phần tử bằng discard
4
print(s2) # {1, 3, 5, 6}
5
6
s2.remove(6) # xóa một phần tử bằng remove
7
print(s2) # {1, 3, 5}
8
9
s2.discard(2)
10
print(s2) # {1, 3, 5}
11
s2.remove(2) # Báo lỗi KeyError vì phần tử không tồn tại
Copied!
Dùng phương thức pop(), clear()
1
s = set("HelloWorld")
2
print(s) # xem kỹ output nhé !
3
4
print(s.pop()) # phần tử đầu tiên của set
5
6
s.pop() # xóa thêm một phần tử
7
print(s)
8
9
s.clear()
10
print(s) # set rỗng: set()
Copied!

Các phép toán trên set

Các phép toán trên set chính là các phép toán trên tập hợp. Xét ví dụ sau:
1
A = {1, 2, 3, 4, 5}
2
B = {4, 5, 6, 7, 8}
3
4
U = A | B # phép hợp
5
print(U) # {1, 2, 3, 4, 5, 6, 7, 8}
6
7
I = A & B # phép giao
8
print(I) # {4, 5}
9
10
D = A-B # phép hiệu
11
print(D) # {1, 2, 3}
12
13
SD = A^B # hiệu của hợp và giao
14
print(SD) # {1, 2, 3, 6, 7, 8}
Copied!

Phương thức của set

Phương thức
Chú giải
add()
Cộng thêm phần tử
clear()
Xóa rỗng set
copy()
Sao chép set
Phần khác (phép - )
Trả về set đã xóa hết các phần tử giống set khác
discard()
Xóa bỏ phần tử đầu của set
Phần giao 2 set (phép &)
Trả về phần giao 2 set
True nếu 2 set không có phần giao
True nếu set chứa trong set khác
True nếu set có chứa một set khác
pop()
Xóa phần tử đầu của set (sẽ báo lỗi nếu xóa phần tử không có trong set)
remove()
Xóa phần tử của set (sẽ báo lỗi nếu xóa phần tử không có trong set)
Trả về set là phần khác đối xứng của 2 xét khác
Trả về set là phần khác đối xứng của 2 set khác
union()
Trả về phần hợp 2 set (phép hợp | )
update()
Trả về một set là hợp của 2 set

Hàm dựng sẵn cho set

Các hàm dựng sẵn như all(), any(), enumerate(), len(), max(), min(), sorted(), sum(), v.v. thường được sử dụng với các set để thực hiện các tác vụ khác nhau.
Function
Description
all()
True nếu tất cả các phần tử true (hoặc set rỗng).
any()
True nếu set có phần tử True. False nếu set rỗng
Trả về một đối tượng liệt kê. Nó chứa chỉ số và giá trị cho tất cả các phần tử của set dưới dạng từng cặp.
len()
Số lượng phần tử của set
max()
Phần tử lớn nhất của set
min()
Phần tử nhỏ nhất của set
sorted()
Trả về một list gồm các phần tử của set đã được sắp xếp
sum()
Tổng các phần tử của set

Frozenset

Frozenset có các đặc điểm của set nhưng không cho phép thêm-sửa-xóa phần tử. Nếu tuple là dạng bất biến của list thì frozenset là dạng bất biến của set.
frozenset được khởi tạo bằng hàm frozenset() và được hỗ trợ các phương thức như: copy(), difference(), intersection(), isdisjoint(), issubset(), issuperset(), symmetric_difference() and union().
Dĩ nhiên là không làm việc với remove(), discard...
Ví dụ
1
A = frozenset([1, 2, 3, 4])
2
B = frozenset([3, 4, 5, 6])
3
4
U = A|B
5
I = A&B
6
D = A-B
7
DS = A^B
8
9
print(U) # frozenset({1, 2, 3, 4, 5, 6})
10
print(I) # frozenset({3, 4})
11
print(D) # frozenset({1, 2})
12
print(DS) # frozenset({1, 2, 5, 6})
Copied!

Thao tác khác

Kiểm tra phần tử chứa trong set

1
s = set("apple")
2
3
print('a' in s) # True
4
print('p' not in s) # False
Copied!

Lặp theo phần tử set

1
for si in set("apple"):
2
print(si) # in từng ký tự trong xâu apple
Copied!