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

Bài 27. Sửa đổi danh sách: chèn, xoá, sắp xếp và cắt lát

Sau khi đã biết tạo danh sách và duyệt qua từng phần tử, bài này đi sâu vào nhóm lệnh giúp thay đổi danh sách khi chương trình đang chạy: chèn thêm, xoá bớt, tra cứu, sắp xếp lại thứ tự và lấy ra một phần của danh sách bằng lát cắt. Đây là những lệnh xuất hiện rất dày trong các câu hỏi lập trình của đề thi.

Chủ đề F · Lập trình, Thuật toán & CTDL (KHMT) - đọc khoảng 13 phút · 25 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 15. Thực hành với kiểu dữ liệu danh sáchtr. 107
  • Kết nối tri thứcTin học 10 - Bài 23. Một số lệnh làm việc với dữ liệu danh sáchtr. 115–118
Xem bảng đối chiếu cả bộ →

Bắt đầu bằng một hình dung

Cuối giờ sinh hoạt, lớp trưởng cầm tờ giấy ghi tên những bạn đăng kí đi cắm trại. Ban đầu danh sách có tám tên, viết theo đúng thứ tự các bạn giơ tay. Rồi mọi chuyện bắt đầu rối lên: một bạn xin rút vì hôm đó nhà có việc, một bạn khác lại chạy tới xin ghi tên bổ sung, và cô giáo dặn phải ghi tên bạn ấy ngay sau tên người cùng tổ để tiện chia nhóm.

Lớp trưởng loay hoay: muốn bỏ một tên thì gạch đi, nhưng gạch xong tờ giấy trông lem nhem; muốn chèn một tên vào giữa thì không còn chỗ trống, đành viết chen vào lề rồi vẽ mũi tên. Đến khi cô yêu cầu nộp danh sách đã xếp theo thứ tự chữ cái, bạn ấy phải chép lại toàn bộ ra một tờ giấy mới.

Cuối buổi, cô hỏi thêm: trong danh sách có bạn nào tên Hà không, nếu có thì đứng thứ mấy, và có bao nhiêu bạn trùng tên đó? Lớp trưởng lại phải dò từ đầu tới cuối bằng mắt.

Mọi thao tác vừa kể - chèn vào giữa, xoá đi một cái, xếp lại thứ tự, dò tìm, đếm số lần xuất hiện, lấy ra vài tên đầu danh sách - đều là những việc mà máy tính làm được chỉ bằng một câu lệnh ngắn. Bài học hôm nay chính là bộ công cụ đó.

Nội dung bài học

  1. 1) Chèn và xoá phần tử ở vị trí bất kì
  2. 2) Tra cứu an toàn: in, index và count
  3. 3) Sắp xếp, đảo chiều và cắt lát danh sách

Tóm tắt lý thuyết cần nhớ

  • Nhóm lệnh sửa danh sách tại chỗ: a.insert(i, x) chèn x vào ô i và đẩy các phần tử sau lùi lại; a.remove(x) xoá phần tử ĐẦU TIÊN có giá trị x; a.pop(i) xoá theo vị trí và trả về giá trị vừa xoá; del a[i] xoá theo vị trí; a.clear() xoá sạch.
  • Nhóm lệnh tra cứu: x in a cho True/False, a.index(x) cho vị trí xuất hiện đầu tiên, a.count(x) đếm số lần xuất hiện. Phải kiểm tra bằng in trước khi gọi index hoặc remove, vì hai lệnh này báo lỗi khi không tìm thấy giá trị.
  • a.sort() (và a.sort(reverse=True)) cùng a.reverse() làm thay đổi danh sách gốc, trong khi sorted(a) trả về một danh sách mới và giữ nguyên a - tuyệt đối không viết a = a.sort().
  • Lát cắt a[i:j] lấy từ ô i đến TRƯỚC ô j và luôn cho một danh sách mới; a[:k] là k phần tử đầu, a[k:] là từ ô k đến hết, a[-1] là phần tử cuối. Riêng b = a chỉ tạo tên gọi thứ hai cho cùng một danh sách, muốn bản sao độc lập phải dùng a.copy() hoặc a[:].

Thuật ngữ tiếng Anh trong bài

Tiếng AnhĐọc làNghĩa
listlítdanh sách
Một dãy nhiều giá trị xếp hàng, giống hộp bút có nhiều ô.
indexIN-đécchỉ số
Số thứ tự của một phần tử.
appendơ-PEN-đờthêm phần tử vào cuối danh sách
Thêm một phần tử mới vào cuối một danh sách đang có - như xếp thêm một bạn vào cuối hàng đang đứng.
valueVA-liugiá trị
Thông tin đi kèm với một khoá - giống số điện thoại đi kèm với cái tên trong sổ liên lạc.

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ó đủ 25 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
Cho danh sách a = [4, 9, 2, 7]. Sau khi thực hiện lệnh x = a.pop(1), giá trị của x và của a lần lượt là gì?
  1. x = 9 và a = [4, 2, 7]
  2. x = 1 và a = [4, 9, 2, 7]
  3. x = 4 và a = [9, 2, 7]
  4. x = 9 và a = [4, 9, 2, 7]
Đáp án: A - Lệnh a.pop(1) xoá phần tử ở ô chỉ số 1 - tức số 9 - đồng thời trả về chính giá trị vừa xoá, nên x = 9 và danh sách còn lại [4, 2, 7]. Phương án 'x = 1' sai vì pop trả về GIÁ TRỊ của phần tử chứ không trả về chỉ số đã truyền vào. Phương án 'x = 4' sai vì nhầm pop(1) với việc xoá phần tử đầu tiên; muốn xoá phần tử đầu phải viết pop(0). Phương án cuối sai vì pop không chỉ đọc mà thật sự xoá phần tử khỏi danh sách, nên a không thể giữ nguyên.
Câu 2 · Nhận biết
Cho a = [10, 20, 30, 40, 50]. Lệnh print(a[1:3]) in ra kết quả nào?
  1. [20, 30, 40]
  2. [20, 30]
  3. [10, 20, 30]
  4. [30, 40]
Đáp án: B - Lát cắt a[1:3] lấy các phần tử từ ô chỉ số 1 đến TRƯỚC ô chỉ số 3, tức chỉ lấy ô 1 và ô 2, cho [20, 30]. Phương án [20, 30, 40] sai vì đã lấy luôn cả phần tử ở ô 3, quên quy tắc dừng trước chỉ số cuối. Phương án [10, 20, 30] sai vì đếm phần tử từ 1 theo thói quen đời thường, trong khi chỉ số danh sách bắt đầu từ 0. Phương án [30, 40] sai vì hiểu nhầm hai số trong lát cắt là 'lấy từ giá trị 30 trở đi'.
Câu 3 · Thông hiểu
Cho a = [5, 1, 3]. Sau khi thực hiện lệnh b = sorted(a), danh sách a có giá trị là gì?
  1. [1, 3, 5]
  2. [5, 3, 1]
  3. [5, 1, 3]
  4. [] (danh sách rỗng)
Đáp án: C - Hàm sorted(a) tạo ra một danh sách MỚI đã sắp xếp rồi gán cho b, còn a hoàn toàn không bị đụng tới nên vẫn là [5, 1, 3]. Phương án [1, 3, 5] là kết quả của b, hoặc là kết quả nếu ta dùng a.sort() - chính đây là chỗ hay nhầm giữa sorted và sort. Phương án [5, 3, 1] là thứ tự giảm dần, chỉ có được khi thêm reverse=True. Phương án danh sách rỗng sai vì sorted không xoá dữ liệu; a chỉ trở thành None nếu ta viết sai thành a = a.sort().
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 a.remove(5) xoá phần tử đầu tiên có giá trị 5; nếu trong a không hề có giá trị 5 thì chương trình sẽ báo lỗi và dừng lại.Đúng
  • b)Lệnh a.reverse() trả về một danh sách mới đã đảo ngược, còn danh sách a vẫn giữ nguyên thứ tự cũ.Sai
  • c)Với a = [3, 8, 1, 6], lát cắt a[:2] cho kết quả [3, 8].Đúng
  • d)Sau lệnh b = a, nếu ta thêm một phần tử vào b thì danh sách a vẫn không hề thay đổi.Sai
Vì sao:
  • (a) Đúng - remove xoá theo giá trị và chỉ xoá lần xuất hiện đầu tiên; khi giá trị cần xoá không có mặt, lệnh này sinh lỗi, vì vậy nên kiểm tra bằng 'if 5 in a:' trước khi gọi.
  • (b) Sai - a.reverse() đảo ngược trực tiếp trên chính danh sách a chứ không trả về danh sách mới; muốn giữ nguyên bản gốc phải dùng cách khác như lát cắt hoặc tạo bản sao trước.
  • (c) Đúng - a[:2] nghĩa là lấy các phần tử từ đầu đến TRƯỚC ô chỉ số 2, tức hai phần tử đầu tiên là 3 và 8.
  • (d) Sai - b = a chỉ tạo thêm một tên gọi trỏ tới cùng một danh sách trong bộ nhớ, nên mọi thay đổi trên b đều hiện ra ở a; muốn độc lập phải viết b = a.copy() hoặc b = a[:].

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 đủ, 25 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 27 trong ứng dụng

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