Tuple & Set
Giai đoạn 2 – Cấu Trúc Dữ Liệu & Hàm · Mục tiêu: Nắm vững Tuple và Set — hai cấu trúc dữ liệu bổ trợ quan trọng bên cạnh List.
1. Tuple (Bộ giá trị)
Giống List nhưng bất biến (immutable) — không thể thay đổi sau khi tạo.
Tạo Tuple
toa_do = (10, 20)
mau = ("đỏ", "xanh", "vàng")
ds = tuple([1, 2, 3]) # Tạo từ list
# Tuple 1 phần tử cần dấu phẩy
t_mot = (42,) # Tuple
t_khong = (42) # Chỉ là số!
# Tuple rỗng
rong = ()
rong = tuple()
Truy cập & Slicing
mau = ("đỏ", "xanh", "vàng", "tím", "cam")
mau[0] # "đỏ"
mau[-1] # "cam"
mau[1:3] # ("xanh", "vàng")
Unpacking
# Gán nhiều biến cùng lúc
toan, ly, hoa = (8.5, 7.2, 9.0)
# Dùng * để gom phần còn lại
dau, *giua, cuoi = (1, 2, 3, 4, 5)
# dau = 1, giua = [2, 3, 4], cuoi = 5
Khi nào dùng Tuple?
- Dữ liệu không cần thay đổi: tọa độ, ngày tháng, RGB
- Dùng làm key trong Dictionary
- Trả về nhiều giá trị từ hàm
def chia(a, b):
return a // b, a % b # Trả về tuple
thuong, du = chia(10, 3) # thuong = 3, du = 1
So sánh List vs Tuple
| Tiêu chí | List [] | Tuple () |
|---|---|---|
| Thay đổi được? | Có | Không |
| Tốc độ | Chậm hơn | Nhanh hơn |
| Dùng làm key dict? | ||
| Khi nào dùng? | Dữ liệu thay đổi | Dữ liệu cố định |
2. Set (Tập hợp)
Không thứ tự, không trùng lặp, thay đổi được.
Tạo Set
s = {1, 2, 2, 3, 3, 3}
print(s) # {1, 2, 3} – tự động loại trùng
# Tạo set từ list (loại trùng)
ds = [1, 2, 2, 3, 3, 4]
s = set(ds) # {1, 2, 3, 4}
# Set rỗng phải dùng set(), KHÔNG dùng {}
rong = set() # Set rỗng
rong = {} # Đây là dict rỗng!
Thêm & Xóa
s = {1, 2, 3}
s.add(4) # {1, 2, 3, 4}
s.update([5, 6]) # {1, 2, 3, 4, 5, 6}
s.remove(6) # {1, 2, 3, 4, 5} – lỗi nếu không có
s.discard(10) # Không lỗi nếu không có
s.pop() # Xóa phần tử ngẫu nhiên
s.clear() # set() – xóa tất cả
Phép toán tập hợp
A = {1, 2, 3, 4, 5}
B = {4, 5, 6, 7, 8}
A | B # Hợp: {1, 2, 3, 4, 5, 6, 7, 8}
A & B # Giao: {4, 5}
A - B # Hiệu: {1, 2, 3}
A ^ B # Hiệu đối xứng: {1, 2, 3, 6, 7, 8}
# Hoặc dùng phương thức
A.union(B) # Hợp
A.intersection(B) # Giao
A.difference(B) # Hiệu
A.symmetric_difference(B) # Hiệu đối xứng
Kiểm tra tập hợp con
A = {1, 2, 3}
B = {1, 2, 3, 4, 5}
A.issubset(B) # True – A ⊂ B
B.issuperset(A) # True – B ⊃ A
A.isdisjoint({6}) # True – không có phần tử chung
Ứng dụng: Loại trùng lặp
ds = [1, 2, 2, 3, 3, 4, 4, 4, 5]
# Loại trùng (MẤT thứ tự)
ds_unique = list(set(ds)) # [1, 2, 3, 4, 5]
# Loại trùng GIỮ thứ tự
ds_unique = list(dict.fromkeys(ds)) # [1, 2, 3, 4, 5]
3. Frozen Set
Set bất biến — có thể dùng làm key trong dictionary.
fs = frozenset([1, 2, 3, 4])
# fs.add(5) # AttributeError – không thể thay đổi
# Dùng làm key trong dict
d = {frozenset({1, 2}): "AB"}
4. So sánh tổng hợp
| Tiêu chí | List [] | Tuple () | Set {} |
|---|---|---|---|
| Có thứ tự | |||
| Thay đổi được | |||
| Cho phép trùng | |||
| Truy cập bằng index | |||
| Dùng làm key dict | (frozenset ) |
Bài tập thực hành
Trắc nghiệm
-
(1, 2, 3) + (4, 5)trả về gì?- A.
(1, 2, 3, (4, 5)) - B.
(1, 2, 3, 4, 5) - C. Lỗi
- D.
[1, 2, 3, 4, 5]
- A.
-
len(set([1, 1, 2, 2, 3, 3]))trả về gì?- A. 6
- B. 3
- C. 2
- D. 1
-
{1, 2, 3} & {2, 3, 4}trả về gì?- A.
{1, 2, 3, 4} - B.
{2, 3} - C.
{1, 4} - D.
{1}
- A.
Thực hành
- Nhập 2 list số → tìm phần tử chung và phần tử chỉ có trong list 1 (dùng set).
- Nhập danh sách tên sinh viên → in ra danh sách không trùng (giữ thứ tự).
- Tạo hàm nhận tuple tọa độ
(x, y)→ tính khoảng cách đến gốc tọa độ. - Nhập 2 chuỗi → kiểm tra xem chúng có cùng tập ký tự hay không (dùng set).
Quay lại: Roadmap · Bài tiếp: Bài 8 – Dictionary