LT365
Chuyển tới nội dung chính
Các yêu cầu hoàn thành

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