Tin Học KHMT
Ôn tập Tin học THPT › Tin học 10 › Bài 29
Tin học 10

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().

Chủ đề F · Lập trình, Thuật toán & CTDL (KHMT) - đọc khoảng 12 phút · 26 câu luyện tập trong ứng dụng

Tương ứng sách giáo khoa
  • 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
Xem bảng đối chiếu cả bộ →

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. 1) Tách một xâu thành nhiều phần với split()
  2. 2) Ghép các phần lại thành một xâu với join()
  3. 3) Tìm kiếm bên trong xâu: in, find() và count()
  4. 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ằng int() hoặc float().
  • "kí_tự_nối".join(danh_sách) là phép ngược của split(), 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ằng str() trước.
  • Tìm kiếm trong xâu: toán tử in cho True/False, s.find(x) cho vị trí xuất hiện đầu tiên và trả về -1 nế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ằng s.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
stringxì-trinhchuỗ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.
strxì-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.

Câu 1 · Nhận biết
Lệnh "8 6 10".split() cho kết quả là gì?
  1. Số nguyên 24 (tổng của ba số trong xâu)
  2. Danh sách [8, 6, 10] gồm ba số nguyên
  3. Danh sách ['8', '6', '10'] gồm ba xâu
  4. Danh sách ['8 6 10'] chỉ có một phần tử
Đáp án: C - Phương thức 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.
Câu 2 · Nhận biết
Khi không tìm thấy xâu con cần tìm, lệnh s.find(xâu_con) trả về giá trị nào?
  1. -1
  2. 0
  3. None
  4. Không trả về gì, chương trình dừng và báo lỗi
Đáp án: A - Theo quy ước của Python, 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.
Câu 3 · Thông hiểu
Cho a = [9, 8, 10]. Khi chạy lệnh " + ".join(a), điều gì xảy ra?
  1. 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
  2. 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
  3. Cho số 27 vì 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
  4. 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
Đáp án: D - 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.
Câu Đúng/Sai (Phần II) · Thông hiểu
Cho biết mỗi phát biểu sau đúng hay sai:
  • 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âu s.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ả True-15 là một số nguyên.Sai
Vì sao:
  • (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ỉ cho True khi 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 cho False vì 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.

Mở bài 29 trong ứng dụng

Phần học miễn phí, không cần tạo tài khoản.