Danh sách (List) & Xâu ký tự (String)
Mục tiêu: dùng đúng List/String Trọng tâm: chỉ số, duyệt, phương thức, hàm
1. So sánh nhanh: List vs String
Cả hai đều là kiểu dữ liệu dạng chuỗi (có thứ tự, dùng chỉ số), nhưng List chứa phần tử (có thể nhiều kiểu) còn String chứa ký tự.
| Tiêu chí |
List |
String |
| Thay đổi trực tiếp? |
Có (mutable) |
Không (immutable) |
| Phần tử |
Bất kỳ kiểu: số, chuỗi, list... |
Chỉ ký tự |
| Dùng khi nào? |
Lưu nhiều giá trị để xử lý (điểm, số đo, danh sách tên...) |
Xử lý văn bản/chuỗi nhập (tách từ, tìm ký tự, thay thế...) |
| Toán tử + |
Nối hai list |
Nối hai chuỗi |
# List: thay đổi trực tiếp được
scores = [7, 8, 9]
scores[0] = 10
print(scores) # [10, 8, 9]
# String: không thể đổi trực tiếp từng ký tự
s = "python"
# s[0] = "P" # lỗi
s = "P" + s[1:]
print(s) # Python
2. Kỹ năng chung: index, slice, len
Index (chỉ số)
a = [10, 20, 30]
s = "abc"
print(a[0]) # 10
print(a[-1]) # 30
print(s[0]) # 'a'
print(s[-1]) # 'c'
Mẹo: -1 là phần tử/ký tự cuối.
Slice (cắt lát)
a = [10, 20, 30, 40, 50]
s = "Hello Python"
print(a[1:4]) # [20, 30, 40]
print(a[:3]) # [10, 20, 30]
print(a[::2]) # [10, 30, 50]
print(s[0:5]) # 'Hello'
print(s[6:]) # 'Python'
print(s[::2]) # 'HloPto'
Nhớ: slice không lấy phần tử ở vị trí kết thúc.
Câu hỏi nhanh: Với a=[1,2,3,4,5] thì a[1:4] trả ra kết quả bao nhiêu?
3. Thao tác hay gặp với danh sách
Tạo list (nhiều cách)
a = []
b = [2, 4, 6]
# Từ chuỗi
c = list("abc") # ['a','b','c']
# Lặp để tạo theo quy luật
sq = []
for i in range(5):
sq.append(i*i)
print(sq) # [0,1,4,9,16]
Thêm / xóa / chèn
a = [1, 2, 3]
# Thêm
a.append(9) # [1,2,3,9]
# Chèn
a.insert(1, 99) # [1,99,2,3,9]
# Xóa theo vị trí
last = a.pop() # lấy 9, a còn [1,99,2,3]
# Xóa theo giá trị
a.remove(99) # [1,2,3]
# Xóa bằng del
del a[0] # [2,3]
Gợi nhớ: remove xóa theo giá trị, còn pop/del xóa theo vị trí.
Duyệt list: 3 kiểu phổ biến
a = [3, 7, 2, 9]
# 1) Theo phần tử
for v in a:
print(v)
# 2) Theo chỉ số
for i in range(len(a)):
print(i, a[i])
Sắp xếp & đảo
a = [5, 1, 4]
b = sorted(a) # tạo list mới
print(a) # [5,1,4]
print(b) # [1,4,5]
a.sort() # sắp xếp tại chỗ
a.reverse() # đảo tại chỗ
c = a[::-1] # tạo bản sao đảo
Nếu đề cấm sorted/sort thì phải tự cài thuật toán.
4. Thao tác hay gặp với xâu kí tự
Chuẩn hóa & kiểm tra
s = " PyThon "
print(s.strip()) # bỏ khoảng trắng đầu/cuối
print(s.lower()) # chữ thường
print(s.upper()) # chữ hoa
print(s.replace("Th", "th"))
print("123".isdigit())
print("abc".isalpha())
Lưu ý: phần lớn method trả về chuỗi mới (s không tự đổi).
Tìm kiếm trong chuỗi
s = "bananas"
print("na" in s) # True
print(s.find("na")) # 2
print(s.find("xyz")) # -1
# index cũng trả vị trí, nhưng lỗi nếu không có
# print(s.index("xyz"))
Mẹo: khi không chắc có tồn tại hay không, ưu tiên find hoặc kiểm tra in trước.
Thao tác tách và hợp (split & join)
# split: tách chuỗi -> list
line = "5 2 9 1 7"
parts = line.split() # ['5','2','9','1','7']
csv = "a,b,c"
parts2 = csv.split(",") # ['a','b','c']
# join: ghép list -> chuỗi
out = "-".join(["a", "b", "c"]) # 'a-b-c'
print(out)
Đếm ký tự / từ
text = "Toi yeu Python"
print(len(text)) # số ký tự (tính cả khoảng trắng)
words = text.split() # tách theo khoảng trắng
print(len(words)) # số từ
print(text.count("o")) # đếm ký tự 'o'
5. Tạo danh sách từ xâu kí tự
(A) Dãy số cách nhau bởi dấu cách
line = input().strip()
parts = line.split()
nums = []
for p in parts:
n = int(p)
nums.append(n)
print(nums)
Ưu điểm: dễ hiểu, dễ debug, đúng chuẩn sư phạm.
(B) Dãy số cách nhau bởi dấu phẩy
line = input().strip()
line = line.replace(" ", "")
parts = line.split(",")
nums = []
for p in parts:
if p != "":
nums.append(int(p))
print(nums)
Có xử lý trường hợp dư dấu phẩy/chuỗi rỗng.
(C) Tạo list ký tự từ chuỗi
s = "abcXYZ"
chars = list(s)
print(chars)
Dùng khi cần duyệt từng ký tự để kiểm tra/đếm.
(D) Tạo list nhiều dòng (đến khi rỗng)
lines = []
while True:
s = input().strip()
if s == "":
break
lines.append(s)
print(lines)
Dùng khi nhập đoạn văn/bài thơ/nhật ký dòng.
Cảnh báo: input() luôn trả về chuỗi. Nếu bạn cộng "5" + "2" sẽ ra "52". Muốn cộng số phải ép kiểu int/float.
6. Một số bài toán phổ biến
Mẫu 1: Đếm theo điều kiện
cnt = 0
for x in nums:
if x % 2 == 0:
cnt += 1
print(cnt)
Ứng dụng: đếm số chẵn, đếm số > 10, đếm ký tự 'a'...
Mẫu 2: Tìm max/min (không dùng max/min)
mx = nums[0]
for x in nums:
if x > mx:
mx = x
print(mx)
Ứng dụng: điểm cao nhất, nhiệt độ lớn nhất, giá trị lớn nhất...
Mẫu 3: Lọc (tạo list mới)
b = []
for x in nums:
if x % 5 != 0:
b.append(x)
print(b)
Ứng dụng: lọc số hợp lệ, lọc học sinh đạt, lọc từ dài...
Mẫu 4: Xử lý chuỗi theo từ
text = input().strip()
words = text.split()
longest = ""
for w in words:
if len(w) > len(longest):
longest = w
print(len(words))
print(longest)
Ứng dụng: đếm từ, tìm từ dài nhất, chuẩn hóa văn bản...
7. Lỗi thường gặp & cách tránh
| Lỗi |
Ví dụ |
Cách sửa |
| Quên ép kiểu khi nhập |
"5" + "2" = "52" |
Dùng int/float trước khi tính |
| Nhầm remove và pop |
a.remove(3) / a.pop(3) |
remove(x) theo giá trị; pop(i) theo vị trí |
| Tưởng string sửa được |
s[0] = 'A' |
Tạo chuỗi mới: nối + slice |
| Dùng index khi có thể không tồn tại |
s.index("xyz") |
Dùng find hoặc kiểm tra "in" trước |
Gợi ý học nhanh: Mỗi phần hãy copy 1 ví dụ chạy thử, rồi tự sửa 1–2 chỗ (đổi điều kiện, đổi dữ liệu) để nhớ lâu.
Sửa lần cuối: Thứ Ba, 6 tháng 1 2026, 7:31 PM