Chọn đến phần học sinh cần nhanh chóng thông qua mục lục bằng cách click đến phần đó
- I. Lý thuyết trọng tâm
- 1. Xâu con và lệnh tìm vị trí xâu con
- 2. Một số lệnh thường dùng với xâu kí tự
- II. Phương pháp giải các dạng bài tập
- Dạng 1: Tìm vị trí xâu con bằng find()
- Dạng 2: Nhập nhiều giá trị trên một dòng bằng split()
- Dạng 3: Chuẩn hóa xâu — xóa dấu cách thừa bằng split() + join()
- Dạng 4: Tách họ tên thành tên và họ đệm
- III. Hướng dẫn thực hành
- Nhiệm vụ 1: Nhập nhiều số nguyên trên một dòng
- Nhiệm vụ 2: Chuẩn hóa dấu cách trong xâu
- Nhiệm vụ 3: Tách họ tên thành tên và họ đệm
- IV. Sơ đồ tư duy
- V. Sai lầm thường gặp
I. Lý thuyết trọng tâm
1. Xâu con và lệnh tìm vị trí xâu con
a) Kiểm tra xâu con bằng toán tử in
Toán tử in kiểm tra xâu thứ nhất có xuất hiện liên tiếp bên trong xâu thứ hai không:
>>> "abc" in "123abc"
True # "abc" xuất hiện trong "123abc"
>>> "010" in "1101"
False # "010" không xuất hiện liên tiếp trong "1101"
Kết quả: True nếu là xâu con, False nếu không phải.
b) Phương thức find() — tìm vị trí xâu con
Python cung cấp phương thức find() dành riêng cho xâu kí tự, cho phép tìm vị trí (chỉ số) đầu tiên mà xâu con xuất hiện trong xâu mẹ.
Cú pháp đơn:
<xâu_mẹ>.find(<xâu_con>)
Trả về chỉ số nơi tìm thấy lần đầu tiên. Nếu không tìm thấy → trả về −1.
Cú pháp đầy đủ (có vị trí bắt đầu):
<xâu_mẹ>.find(<xâu_con>, start)
Tìm xâu con bắt đầu từ vị trí start trở đi (bỏ qua các vị trí trước đó).
Ví dụ minh họa:
>>> s = "ab bc cd 123 456 00"
>>> s.find("b")
1 # "b" xuất hiện đầu tiên tại chỉ số 1
>>> s.find("12")
9 # "12" xuất hiện đầu tiên tại chỉ số 9
>>> s.find("AB")
-1 # "AB" không có trong s → trả về -1
>>> sub = "Đà Nẵng"
>>> s = "Hà Nội - Đà Nẵng - Hồ Chí Minh"
>>> s.find(sub)
9 # tìm thấy "Đà Nẵng" tại chỉ số 9
>>> s.find(sub, 10)
-1 # tìm từ vị trí 10 trở đi → không thấy nữa
So sánh
invàfind(): Toán tửinchỉ trả lời có hay không (True/False). Phương thứcfind()cho biết thêm vị trí cụ thể (hoặc −1 nếu không có).
Câu hỏi kiểm tra nhanh: Biểu thức logic sau đúng hay sai?
>>> "010" in "00100"
→ True. Xâu "00100" có các kí tự: '0'(0) '0'(1) '1'(2) '0'(3) '0'(4). Tại chỉ số 1, 2, 3 ta có '0','1','0' = "010" → tìm thấy xâu con.
Câu hỏi kiểm tra nhanh: Lệnh sau trả lại giá trị gì?
>>> "ababababab".find("ab", 4)
→ 4. Xâu "ababababab" có chỉ số: a(0) b(1) a(2) b(3) a(4) b(5) a(6) b(7) a(8) b(9). Tìm từ vị trí 4 trở đi, gặp "ab" ngay tại chỉ số 4 (a ở vị trí 4, b ở vị trí 5).
2. Một số lệnh thường dùng với xâu kí tự
a) Phương thức split() — tách xâu thành danh sách
split() chia một xâu thành danh sách các từ dựa theo kí tự phân tách.
Cú pháp:
<xâu>.split(<kí_tự_tách>)
- Nếu không truyền kí tự tách → mặc định tách theo dấu cách (và tự động bỏ qua nhiều dấu cách liên tiếp).
- Nếu truyền kí tự tách (ví dụ
",") → tách theo kí tự đó.
>>> s = "Tiên học lễ hậu học văn"
>>> s.split()
['Tiên', 'học', 'lễ', 'hậu', 'học', 'văn']
>>> st = "0,1,2,3,4,5,6,10"
>>> st.split(",")
['0', '1', '2', '3', '4', '5', '6', '10']
Đặc biệt:
split()không truyền tham số sẽ xử lí được cả trường hợp nhiều dấu cách liên tiếp — tất cả đều bị bỏ qua, kết quả chỉ gồm các từ có nghĩa.
b) Phương thức join() — nối danh sách thành xâu
join() là phép ngược của split(): nối các phần tử của danh sách (phải là xâu) thành một xâu duy nhất, xen giữa bằng kí tự nối.
Cú pháp:
"<kí_tự_nối>".join(<danh_sách>)
>>> A = ['Tiên', 'học', 'lễ', 'hậu', 'học', 'văn']
>>> " ".join(A)
'Tiên học lễ hậu học văn'
>>> B = ['0', '1', '2', '3', '4', '5', '6', '10']
>>> ",".join(B)
'0,1,2,3,4,5,6,10'
Lưu ý: Tất cả phần tử trong danh sách phải là xâu kí tự. Nếu có phần tử là số → phải chuyển bằng
str()trước khi dùngjoin().
c) Bảng tổng hợp các phương thức xâu
| Phương thức | Cú pháp | Chức năng | Kết quả |
|---|---|---|---|
| find() | s.find(sub) |
Tìm vị trí đầu tiên của xâu con sub |
Chỉ số (int), hoặc −1 |
| find() có start | s.find(sub, start) |
Tìm từ vị trí start trở đi |
Chỉ số (int), hoặc −1 |
| split() | s.split() |
Tách xâu theo dấu cách | Danh sách (list) |
| split() có kí tự | s.split(",") |
Tách xâu theo kí tự chỉ định | Danh sách (list) |
| join() | " ".join(A) |
Nối danh sách thành xâu bằng dấu cách | Xâu (str) |
Câu hỏi kiểm tra nhanh: Cho xâu "gà,vịt,chó,lợn,ngựa,cá". Trình bày cách xóa các dấu "," và thay bằng dấu cách " ".
→ Kết hợp split(",") rồi " ".join():
s = "gà,vịt,chó,lợn,ngựa,cá"
ds = s.split(",") # ['gà', 'vịt', 'chó', 'lợn', 'ngựa', 'cá']
skq = " ".join(ds) # 'gà vịt chó lợn ngựa cá'
II. Phương pháp giải các dạng bài tập
Dạng 1: Tìm vị trí xâu con bằng find()
Phương pháp:
- Dùng
s.find(sub)để tìm vị trí đầu tiên của xâu con. - Nếu cần tìm từ vị trí cụ thể, dùng
s.find(sub, start). - Kết quả −1 nghĩa là không tìm thấy.
- Muốn tìm tất cả các vị trí: dùng vòng lặp, mỗi lần tìm thấy thì cập nhật
start= vị trí vừa tìm + 1.
Bài tập mẫu: Cho c = "Trường Sơn" và m = "Bước chân trên dải Trường Sơn". Kiểm tra c có phải xâu con của m không, nếu có tìm vị trí.
Lời giải:
c = "Trường Sơn"
m = "Bước chân trên dải Trường Sơn"
vt = m.find(c)
if vt != -1:
print("Tìm thấy tại vị trí:", vt)
else:
print("Không tìm thấy")
Kết quả: Tìm thấy tại vị trí: 18
Dạng 2: Nhập nhiều giá trị trên một dòng bằng split()
Phương pháp:
Quy trình chuẩn 3 bước:
- Bước 1: Nhập toàn bộ dữ liệu dưới dạng một xâu bằng
input(). - Bước 2: Dùng
split()tách xâu thành danh sách các xâu con. - Bước 3: Nếu cần xử lí số → chuyển đổi kiểu bằng
int()hoặcfloat().
Bài tập mẫu (SGK – Thực hành, Nhiệm vụ 1): Nhập nhiều số nguyên cách nhau bởi dấu cách. Thông báo số lượng và in các số trên hàng ngang.
Lời giải:
s = input("Nhập các số nguyên cách nhau bởi dấu cách: ")
sline = s.split()
n = len(sline)
nline = []
for x in sline:
nline.append(int(x))
print("Bạn đã nhập", n, "số.")
for k in nline:
print(k, end=" ")
Giải thích: input() nhập xâu → split() tách thành danh sách xâu → vòng for chuyển từng phần tử sang int và đưa vào nline → in kết quả.
Dạng 3: Chuẩn hóa xâu — xóa dấu cách thừa bằng split() + join()
Phương pháp:
Đây là bài toán kinh điển: xâu có nhiều dấu cách liên tiếp giữa các từ, cần chỉnh về đúng một dấu cách.
Giải pháp cực ngắn gọn: split() tự động bỏ qua mọi dấu cách thừa khi tách, sau đó join() nối lại bằng đúng một dấu cách.
s = input("Nhập đoạn văn bản: \n")
sline = s.split()
skq = " ".join(sline)
print(skq)
Ví dụ: Nhập " Tin học 10 " → split() cho ['Tin', 'học', '10'] → " ".join() cho "Tin học 10".
Dạng 4: Tách họ tên thành tên và họ đệm
Phương pháp:
- Bước 1: Dùng
split()tách họ tên thành danh sách các từ. - Bước 2: Phần tử cuối cùng (chỉ số
len() - 1) là tên. - Bước 3: Các phần tử còn lại ghép bằng
" ".join()là họ đệm.
Bài tập mẫu (SGK – Thực hành, Nhiệm vụ 3): Nhập n họ tên học sinh, in ra danh sách hai cột: tên và họ đệm.
Lời giải:
n = int(input("Nhập số học sinh trong lớp: "))
ten = []
hodem = []
for i in range(n):
s = input("Nhập họ tên học sinh thứ " + str(i+1) + ": ")
sline = s.split()
m = len(sline) - 1
ten.append(sline[m])
del sline[m]
hodem.append(" ".join(sline))
print("Danh sách học sinh:")
for i in range(n):
print(ten[i], hodem[i])
Giải thích: Với mỗi họ tên, split() tách thành danh sách từ. Phần tử cuối (sline[m]) là tên → đưa vào list ten. Xóa phần tử cuối bằng del, phần còn lại nối lại bằng " ".join() → là họ đệm.
Ví dụ: "Nguyễn Thành Công" → sline = ['Nguyễn', 'Thành', 'Công'] → tên: "Công", họ đệm: "Nguyễn Thành".
III. Hướng dẫn thực hành
Nhiệm vụ 1: Nhập nhiều số nguyên trên một dòng
Đề bài: Nhập nhiều số nguyên cách nhau bởi dấu cách. Thông báo số lượng và in các số trên hàng ngang.
s = input("Nhập các số nguyên cách nhau bởi dấu cách: ")
sline = s.split()
n = len(sline)
nline = []
for x in sline:
nline.append(int(x))
print("Bạn đã nhập", n, "số.")
for k in nline:
print(k, end=" ")
Giải thích: Nhập cả dòng dưới dạng xâu → split() tách thành list xâu → chuyển từng phần tử sang int → đếm bằng len() → in bằng for...in.
Nhiệm vụ 2: Chuẩn hóa dấu cách trong xâu
Đề bài: Nhập xâu có thể có nhiều dấu cách giữa các từ. Chỉnh sửa sao cho giữa các từ chỉ có một dấu cách.
s = input("Nhập đoạn văn bản: \n")
sline = s.split()
skq = " ".join(sline)
print(skq)
Giải thích: split() không truyền tham số → tự động tách theo mọi dấu cách (kể cả nhiều dấu cách liên tiếp), loại bỏ dấu cách thừa. " ".join() nối lại bằng đúng một dấu cách.
Nhiệm vụ 3: Tách họ tên thành tên và họ đệm
Đề bài: Nhập n họ tên, in ra hai cột: cột 1 là tên, cột 2 là họ đệm.
n = int(input("Nhập số học sinh trong lớp: "))
ten = []
hodem = []
for i in range(n):
s = input("Nhập họ tên học sinh thứ " + str(i+1) + ": ")
sline = s.split()
m = len(sline) - 1
ten.append(sline[m])
del sline[m]
hodem.append(" ".join(sline))
print("Danh sách học sinh:")
for i in range(n):
print(ten[i], hodem[i])
Giải thích: Mỗi họ tên được split() tách thành danh sách từ. Từ cuối cùng là tên, các từ còn lại ghép bằng join() thành họ đệm. Lưu vào hai list riêng, cuối cùng in song song.
IV. Sơ đồ tư duy
1. Xâu con và lệnh find()
- 1.1. Kiểm tra xâu con:
s1 in s2→ True/False - 1.2. Tìm vị trí:
s.find(sub)→ chỉ số đầu tiên, hoặc −1 - 1.3. Tìm từ vị trí:
s.find(sub, start)→ bắt đầu từ start - 1.4. Phân biệt chữ hoa/thường:
find("AB")≠find("ab")
2. Lệnh split() — tách xâu
- 2.1.
s.split()— tách theo dấu cách (mặc định), bỏ cách thừa - 2.2.
s.split(",")— tách theo kí tự chỉ định - 2.3. Kết quả: danh sách (list) các xâu con
3. Lệnh join() — nối danh sách
- 3.1.
" ".join(A)— nối bằng dấu cách - 3.2.
",".join(B)— nối bằng dấu phẩy - 3.3. Ngược lại với split(); phần tử phải là xâu
4. Ứng dụng kết hợp split() + join()
- 4.1. Chuẩn hóa dấu cách:
" ".join(s.split()) - 4.2. Thay thế kí tự phân tách:
split(",")rồi" ".join() - 4.3. Tách họ tên: phần tử cuối = tên, còn lại = họ đệm
- 4.4. Nhập nhiều số trên một dòng:
split()rồiint()
V. Sai lầm thường gặp
| Sai lầm | Đính chính |
|---|---|
find() trả về True/False giống in |
Sai. find() trả về chỉ số (số nguyên) nếu tìm thấy, hoặc −1 nếu không. Toán tử in mới trả về True/False. |
find() không phân biệt chữ hoa/thường |
Sai. find() phân biệt chữ hoa/thường. s.find("AB") và s.find("ab") cho kết quả khác nhau. Ví dụ: "ab bc".find("AB") → −1. |
split(",") và split() cho kết quả giống nhau |
Khác nhau. split() tách theo dấu cách (và bỏ cách thừa). split(",") tách theo dấu phẩy. Ví dụ: "a, b".split() → ['a,', 'b'] nhưng "a, b".split(",") → ['a', ' b']. |
Dùng join() với danh sách chứa số: " ".join([1, 2, 3]) |
Lỗi TypeError. join() yêu cầu tất cả phần tử phải là xâu. Cần chuyển đổi: " ".join([str(x) for x in [1,2,3]]) hoặc chuyển từng phần tử bằng str() trước. |
| Nhầm lẫn khi kiểm tra xâu con — không đếm kĩ vị trí | Cần kiểm tra cẩn thận từng vị trí liên tiếp. Ví dụ: "010" in "00100" → True (tại chỉ số 1, 2, 3: '0','1','0' = "010"). Nhưng "010" in "001100" → False (không có 3 kí tự liên tiếp nào tạo thành "010"). Phải đếm chính xác, không đoán. |
Tách họ tên bằng split() rồi lấy sline[0] là tên |
Sai. Tên người Việt nằm ở cuối cùng, nên tên = sline[len(sline)-1] (phần tử cuối). sline[0] là họ. |

Thầy Phạm Thành Danh
(Người kiểm duyệt, ra đề)
Chức vụ: Trưởng ban biên soạn môn Tin Học THPT
Trình độ: Cử nhân Sư phạm Tin học, Chứng chỉ hạng II, Chứng chỉ Tin học, Ngoại ngữ B1
Kinh nghiệm: 8+ năm kinh nghiệm tại Trường THPT Thuận Hóa
