Bài 29. Tách, ghép và tìm kiếm dữ liệu trong xâu kí tự
Dữ liệu người dùng gõ vào bao giờ cũng đến với chương trình dưới dạng một xâu duy nhất. Bài này học cách cắt xâu đó thành nhiều mảnh bằng split(), ghép các mảnh lại bằng join(), và dò tìm một mẩu nội dung bên trong xâu bằng in, find(), count().
- Cánh DiềuTin học 10 - Chủ đề F · Bài 13. Thực hành dữ liệu kiểu xâutr. 99
- Kết nối tri thứcTin học 10 - Bài 25. Một số lệnh làm việc với xâu kí tựtr. 123–126
Bắt đầu bằng một hình dung
Câu lạc bộ văn nghệ của trường vừa tổ chức một hội thi nhỏ. Ba thầy cô ngồi ghế giám khảo, mỗi tiết mục hát xong thì mỗi người cho một điểm. Bạn thư kí ngồi bàn dưới, cứ hết một tiết mục lại ghi vội vào cuốn sổ đúng một dòng: họ tên người hát, một dấu phẩy, tên lớp, một dấu phẩy nữa, rồi ba con điểm của ba giám khảo viết cách nhau bởi khoảng trắng. Vì ghi vội nên chỗ thì thừa mấy khoảng trắng, chỗ thì chữ dính sát vào dấu phẩy.
Tan hội thi, bạn thư kí mang cuốn sổ về nhà tổng kết. Với mỗi dòng, bạn phải làm những việc rất giống nhau: cắt dòng chữ ra thành từng phần riêng biệt để biết đâu là tên, đâu là lớp, đâu là mấy con điểm; cộng ba điểm lại thành tổng của tiết mục; rồi dò xem trong sổ có bạn nào tên Ngọc như cô chủ nhiệm hỏi hay không.
Xong xuôi, bạn lại phải làm việc ngược lại: gom những mẩu thông tin rời rạc kia thành một dòng thông báo gọn gàng để dán lên bảng tin, kiểu như "Ngọc: 9 + 8 + 10 = 27".
Cắt một dòng chữ thành nhiều mảnh, gom nhiều mảnh thành một dòng chữ, và dò tìm một mẩu chữ bên trong một dòng dài - đó chính xác là ba việc mà bài học hôm nay dạy máy tính làm thay chúng ta.
Nội dung bài học
- 1) Tách một xâu thành nhiều phần với split()
- 2) Ghép các phần lại thành một xâu với join()
- 3) Tìm kiếm bên trong xâu: in, find() và count()
- 4) Làm sạch và kiểm tra dữ liệu nhập trước khi ép kiểu
Tóm tắt lý thuyết cần nhớ
s.split()tách xâu theo dấu cách,s.split(kí_tự)tách theo dấu phân cách tự chọn; kết quả luôn là danh sách các xâu, muốn tính toán phải ép kiểu bằngint()hoặcfloat()."kí_tự_nối".join(danh_sách)là phép ngược củasplit(), ghép danh sách thành một xâu; mọi phần tử phải là xâu, gặp số thì phải chuyển bằngstr()trước.- Tìm kiếm trong xâu: toán tử
inchoTrue/False,s.find(x)cho vị trí xuất hiện đầu tiên và trả về-1nếu không thấy,s.count(x)đếm số lần xuất hiện. - Trước khi ép kiểu dữ liệu nhập, hãy làm sạch bằng
s.strip()và kiểm tra bằngs.isdigit(),s.startswith(),s.endswith()để chương trình không bị dừng giữa chừng.
Thuật ngữ tiếng Anh trong bài
| Tiếng Anh | Đọc là | Nghĩa |
|---|---|---|
| string | xì-trinh | chuỗi (xâu kí tự) Một xâu các chữ cái, số hoặc kí hiệu viết trong dấu nháy. |
| str | xì-tơ | kiểu chuỗi (str) Kiểu chuỗi chữ trong Python, dùng cho đoạn chữ viết trong dấu nháy. |
Câu hỏi trắc nghiệm có đáp án
Mấy câu mẫu để bạn tự kiểm tra ngay. Trong ứng dụng, bài này có đủ 26 câu, chấm điểm tự động và giải thích từng câu sai.
"8 6 10".split() cho kết quả là gì?- Số nguyên
24(tổng của ba số trong xâu) - Danh sách
[8, 6, 10]gồm ba số nguyên - Danh sách
['8', '6', '10']gồm ba xâu - Danh sách
['8 6 10']chỉ có một phần tử
split() cắt xâu theo dấu cách và luôn trả về một danh sách gồm các XÂU, nên đáp án đúng là ['8', '6', '10'] (mỗi phần tử nằm trong dấu nháy). Phương án [8, 6, 10] sai vì split() không hề tự ép kiểu sang số - muốn có số phải dùng thêm int(). Phương án 24 sai vì split() chỉ tách xâu chứ không tính toán gì. Phương án ['8 6 10'] sai vì xâu có hai dấu cách nên bị cắt thành ba mảnh, không phải giữ nguyên một mảnh.s.find(xâu_con) trả về giá trị nào?-10None- Không trả về gì, chương trình dừng và báo lỗi
find() trả về -1 khi không tìm thấy - một giá trị không thể là chỉ số hợp lệ, nhờ đó ta phân biệt được với trường hợp tìm thấy. Phương án 0 sai vì 0 chính là kết quả khi tìm THẤY xâu con ngay ở đầu xâu, đây là bẫy rất hay gặp. Phương án None sai vì đó là kết quả của một số lệnh khác chứ không phải find(). Phương án báo lỗi cũng sai: find() được thiết kế để chạy êm, chỉ trả về -1 chứ không làm dừng chương trình.a = [9, 8, 10]. Khi chạy lệnh " + ".join(a), điều gì xảy ra?- Cho xâu
"9 + 8 + 10", vìjoin()tự chuyển các số nguyên thành xâu rồi mới nối chúng lại - Cho danh sách
[9, 8, 10]giữ nguyên như cũ, vìjoin()chỉ nối các phần tử ở bên trong danh sách - Cho số
27vì các phần tử được cộng lại, do dấu+đặt giữa hai dấu nháy được hiểu là phép cộng - Chương trình báo lỗi vì các phần tử là số nguyên, phải chuyển sang xâu bằng
str()trước khi ghép
join() chỉ ghép được danh sách mà MỌI phần tử đều là xâu; gặp số nguyên nó báo lỗi ngay chứ không tự chuyển kiểu giùm. Muốn có kết quả "9 + 8 + 10" thì phải tạo trước một danh sách xâu, chẳng hạn ['9', '8', '10'] bằng cách dùng str() cho từng phần tử - nên phương án đầu tiên chỉ đúng khi danh sách đã là xâu. Phương án [9, 8, 10] sai vì join() sinh ra một xâu chứ không trả lại danh sách. Phương án 27 sai vì dấu cộng ở đây chỉ là kí tự nối để dán vào giữa các mảnh, hoàn toàn không phải phép cộng số học.- a)Lệnh
"Hà Nội".split()cho kết quả là danh sách['Hà', 'Nội'].Đúng - b)Lệnh
s.count("a")cho biết vị trí xuất hiện đầu tiên của kí tự"a"trong xâus.Sai - c)Lệnh
"-".join(["a", "b", "c"])cho kết quả là xâu"a-b-c".Đúng - d)Lệnh
"-15".isdigit()cho kết quảTruevì-15là một số nguyên.Sai
- (a) Đúng -
split()không đối số cắt xâu tại dấu cách, xâu"Hà Nội"có một dấu cách nên được tách thành hai phần tử xâu. - (b) Sai -
count()ĐẾM SỐ LẦN xuất hiện; lệnh cho biết vị trí xuất hiện đầu tiên làfind(). Đây là hai lệnh rất hay bị nhầm lẫn với nhau. - (c) Đúng - kí tự nối
"-"được dán vào giữa các phần tử liền kề, ba phần tử thì có hai chỗ nối nên ra"a-b-c". - (d) Sai -
isdigit()chỉ choTruekhi xâu gồm TOÀN chữ số; dấu trừ không phải chữ số nên kết quả làFalse, tương tự"7.5".isdigit()cũng choFalsevì có dấu chấm.
Thử ngay: minh hoạ từng bước
Bấm từng bước để tự xem cơ chế hoạt động, hoặc bấm “Tự chạy” cho nó tiến mỗi giây một lần. Đổi được dữ liệu đầu vào - không cần đăng nhập.
Học trọn bài này trong ứng dụng
Bài giảng đầy đủ, 26 câu luyện tập chấm tự động, thi thử đúng cấu trúc đề tốt nghiệp (24 trắc nghiệm + 4 Đúng/Sai), bài thực hành máy tự chấm và gia sư AI giải thích chỗ sai.
Phần học miễn phí, không cần tạo tài khoản.
Bài liên quan - Lập trình, Thuật toán & CTDL (KHMT)
Cùng mạch kiến thức với bài này, học nối tiếp cho chắc phần lí thuyết.