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?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ử chungphầ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