Bài 6: List, tuple và set trong Python

Bài 5 bạn đã lặp qua dữ liệu bằng vòng lặp. Giờ ta học cách gom nhiều giá trị vào một biến — thứ bạn sẽ dùng ở gần như mọi chương trình. Python có ba kiểu hay gặp nhất: list, tuple, set. Cuối bài bạn tự viết một chương trình quản lý danh sách việc cần làm (thêm, xóa, xem) — chạy ra kết quả thật.
⏱️ Cách học bài này (~30 phút): đọc ba kiểu + code mẫu (10’), tự gõ và chạy các bài thực hành (12’), xem lỗi thường gặp (4’), tự kiểm + lưu code mang về (4’).
Mục tiêu bài học
Sau bài này bạn sẽ:
- Dùng list: tạo, thêm (
.append), xóa (.remove), duyệt, kiểm tra (in). - Biết tuple là gì và vì sao “bất biến”.
- Dùng set để khử trùng và kiểm tra tồn tại nhanh.
- Tự viết chương trình quản lý việc cần làm — thêm vào kho code cá nhân.
Nội dung: ba cách gom giá trị
1. List — danh sách sửa được [ ]
List có thứ tự, thay đổi được — kiểu dùng nhiều nhất:
viec = ["Học Python", "Trả lời email"]
viec.append("Họp nhóm") # thêm vào cuối
viec.remove("Trả lời email") # xóa theo giá trị
print(viec) # ['Học Python', 'Họp nhóm']
print(len(viec)) # 2 — đếm số phần tử
print("Học Python" in viec) # True — kiểm tra tồn tại
Truy cập theo vị trí (bắt đầu từ 0): viec[0] là phần tử đầu. Duyệt bằng vòng lặp:
for v in viec:
print("-", v)
2. Tuple — danh sách “khoá cứng” ( )
Tuple giống list nhưng không sửa được sau khi tạo — hợp cho dữ liệu cố định:
toa_do = (10, 20) # ví dụ toạ độ x, y
print(toa_do[0]) # 10
# toa_do[0] = 5 # LỖI: tuple không cho đổi
Dùng tuple khi bạn muốn chắc chắn dữ liệu không bị đổi nhầm (ngày sinh, toạ độ, cấu hình cố định).
3. Set — tập không trùng { }
Set không giữ thứ tự và tự loại phần tử trùng — cực tiện để khử trùng:
so = [1, 2, 2, 3, 3, 3]
print(set(so)) # {1, 2, 3} — bỏ trùng
print(len(set(so))) # 3 — đếm giá trị khác nhau
Code mẫu có chú thích: quản lý việc cần làm
Ghép list + vòng lặp + điều kiện thành một chương trình nhỏ:
viec = [] # danh sách rỗng ban đầu
while True:
lenh = input("Thêm (a), Xóa (x), Xem (v), Thoát (q): ")
if lenh == "a":
viec.append(input("Việc cần thêm: "))
elif lenh == "x":
can_xoa = input("Việc cần xóa: ")
if can_xoa in viec: # kiểm tra trước khi xóa
viec.remove(can_xoa)
else:
print("Không tìm thấy việc đó.")
elif lenh == "v":
for i, v in enumerate(viec, 1): # enumerate đánh số từ 1
print(f"{i}. {v}")
elif lenh == "q":
break
Mấu chốt: .append() để thêm, .remove() để xóa (nhớ kiểm tra in trước kẻo lỗi), và enumerate để in kèm số thứ tự.
Bài thực hành code (tự gõ)
Bài 1 — Đếm phần tử: cho mon = ["Toán", "Lý", "Hóa"], in số môn bằng len().
Bài 2 — Khử trùng: cho diem_danh = ["Lan", "Nam", "Lan", "Hoa", "Nam"], in danh sách tên không trùng và số người khác nhau.
✅ Gợi ý: dùng set().
Bài 3 — Kiểm tra & thêm: cho một list gio_hang, hỏi người dùng một món; nếu chưa có thì thêm vào, nếu đã có thì báo “Đã có trong giỏ”.
✅ Gợi ý: dùng in và .append().
Lỗi thường gặp & cách sửa
.remove(x)khi x không có trong list →ValueError. Luôn kiểm traif x in listtrước khi xóa.- Lẫn
[],(),{}→ sai kiểu. Nhớ: list[], tuple(), set{}. - Sửa tuple →
TypeError. Tuple bất biến; cần đổi thì dùng list. - Chỉ số vượt giới hạn (
viec[5]khi list chỉ có 2 phần tử) →IndexError. Đếm bằnglen()trước. - Đọc kỹ thông báo lỗi để sửa nhanh: xem cách đọc lỗi và debug cho người mới.
💾 Mang về — chương trình quản lý việc
Lưu vào kho code cá nhân (bài L6 trong series):
# todo.py — quản lý danh sách việc cần làm
viec = []
while True:
lenh = input("Thêm (a), Xóa (x), Xem (v), Thoát (q): ")
if lenh == "a":
viec.append(input("Việc: "))
elif lenh == "x":
v = input("Xóa việc: ")
viec.remove(v) if v in viec else print("Không có.")
elif lenh == "v":
for i, v in enumerate(viec, 1):
print(f"{i}. {v}")
elif lenh == "q":
break
Thuật ngữ chốt
| Thuật ngữ | Giải thích ngắn |
|---|---|
list [] |
Danh sách có thứ tự, sửa được |
tuple () |
Dãy có thứ tự, không sửa được (bất biến) |
set {} |
Tập không trùng, không thứ tự |
| .append() / .remove() | Thêm vào cuối / xóa theo giá trị |
| in | Kiểm tra một phần tử có trong tập không |
| enumerate() | Duyệt kèm số thứ tự |
Tự kiểm tra & lời giải
[],(),{}lần lượt là kiểu gì? (Đáp án: list, tuple, set)set([1,1,2])cho kết quả gì? (Đáp án:{1, 2})- Vì sao nên kiểm tra
intrước khi.remove()? (Đáp án: tránhValueErrorkhi phần tử không tồn tại)
Lời giải Bài thực hành:
# Bài 1
mon = ["Toán", "Lý", "Hóa"]
print(len(mon)) # 3
# Bài 2
diem_danh = ["Lan", "Nam", "Lan", "Hoa", "Nam"]
khong_trung = set(diem_danh)
print(khong_trung, len(khong_trung)) # 3 tên khác nhau (thứ tự set không cố định)
# Bài 3
gio_hang = ["táo", "sữa"]
mon = input("Thêm món: ")
if mon in gio_hang:
print("Đã có trong giỏ")
else:
gio_hang.append(mon)
print(gio_hang)
Ghi nhớ nhanh
- list
[]sửa được (append/remove/in); tuple()bất biến; set{}khử trùng. - Xóa an toàn: kiểm tra
intrước rồi mới.remove(). - Khử trùng nhanh một list:
set(danh_sach).
👉 Bài tập về nhà: nâng cấp chương trình todo để không cho thêm việc trùng (gợi ý: kiểm tra in trước khi .append()). Bài tiếp theo trong series: Bài 7 — Dictionary (sắp đăng).
Câu hỏi thường gặp
List, tuple và set khác nhau thế nào?
List là danh sách có thứ tự, sửa được (thêm/xóa/đổi), viết trong dấu ngoặc vuông []. Tuple cũng có thứ tự nhưng KHÔNG sửa được sau khi tạo, viết trong ngoặc tròn (). Set là tập hợp KHÔNG trùng lặp và KHÔNG có thứ tự, viết trong ngoặc nhọn {}. Dùng list khi cần một danh sách thay đổi được, tuple cho dữ liệu cố định, set khi cần loại bỏ trùng.
Làm sao thêm và xóa phần tử trong list?
Thêm vào cuối bằng .append(x); chèn tại vị trí bằng .insert(i, x); xóa theo giá trị bằng .remove(x); xóa theo vị trí bằng .pop(i). Kiểm tra một phần tử có trong list không bằng toán tử in, ví dụ ‘nếu “Học” in danh_sach’. Đây là các thao tác bạn sẽ dùng liên tục.
Khi nào nên dùng set?
Dùng set khi bạn cần một tập các giá trị không trùng lặp, hoặc muốn loại bỏ phần tử trùng nhanh chóng. Ví dụ set([1,2,2,3]) cho {1,2,3}. Set cũng kiểm tra ‘có tồn tại hay không’ rất nhanh. Nhược điểm: set không giữ thứ tự và không cho phần tử trùng, nên không dùng khi thứ tự quan trọng.
Thợ code chính hiệu, thích dắt người mới qua mấy đoạn 'khó nhằn' bằng giọng nhẹ tênh. Châm ngôn: cứ làm dự án thật, sai thì sửa, vui là chính.
Bài liên quan

10 tài nguyên học lập trình miễn phí chất lượng (2026)
Học lập trình không cần tốn tiền khóa học đắt đỏ. Đây là 10 tài nguyên miễn phí thật sự chất lượng, phân theo trình độ và mục đích — kèm gợi ý nên bắt đầu từ đâu.

Bài 4: HTML — liên kết, ảnh, danh sách và bảng
Bài 4 series Web cơ bản (bài học 30 phút): thêm liên kết, ảnh, danh sách và bảng vào trang cá nhân — bốn thẻ HTML dùng nhiều nhất, qua bài thực hành gõ code và file mang về.

Bài 5: Vòng lặp for và while trong Python
Bài 5 series Python cho người mới (bài học 30 phút): lặp công việc với for và while, dùng range() và break/continue, qua một chương trình tính tổng và trung bình điểm tự viết — kèm bài tập và code mang về.