Chuyển tới nội dung chính

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ơnNhanh hơn
Dùng làm key dict?
Khi nào dùng?Dữ liệu thay đổiDữ 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. (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]
  2. len(set([1, 1, 2, 2, 3, 3])) trả về gì?

    • A. 6
    • B. 3
    • C. 2
    • D. 1
  3. {1, 2, 3} & {2, 3, 4} trả về gì?

    • A. {1, 2, 3, 4}
    • B. {2, 3}
    • C. {1, 4}
    • D. {1}

Thực hành​

  1. Nhập 2 list số → tìm phần tử chung và phần tử chỉ có trong list 1 (dùng set).
  2. Nhập danh sách tên sinh viên → in ra danh sách không trùng (giữ thứ tự).
  3. Tạo hàm nhận tuple tọa độ (x, y) → tính khoảng cách đến gốc tọa độ.
  4. 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