Giải Tin Học 10 trang 112
Lời giải chi tiết SGK Lớp 10 · Môn Tin Há»c · Trang 112–115
Bài 22: Kiểu dữ liệu danh sách (list)
🔍 Kiến thức cần nhớ
1. Kiểu dữ liệu danh sách (list)
- List là kiểu dữ liệu dạng dãy/mảng trong Python, được dùng phổ biến nhất để lưu nhiều giá trị.
- Khởi tạo bằng lệnh gán với các phần tử trong cặp dấu ngoặc vuông
[ ]:
```python
A = [phần tử 0, phần tử 1, ..., phần tử n-1]
```
- Điểm đặc biệt: các phần tử của list có thể có kiểu dữ liệu khác nhau (số nguyên, số thực, xâu, lôgic...).
- Truy cập/thay đổi phần tử qua chỉ số, viết là
A[i]. Chỉ số bắt đầu từ 0, kết thúc ởlen(A) - 1. len(A): lệnh tính độ dài (số phần tử) của danh sách.- Xóa phần tử:
del A[i]. - Ghép hai danh sách: dùng phép
+; nhân bản: dùng phép*.
2. Duyệt phần tử của danh sách
- Dùng
for i in range(...)để duyệt theo chỉ số. range(len(A)): chạy i từ 0 đến len(A) − 1 (toàn bộ danh sách).
3. Thêm phần tử (phương thức)
- Cú pháp phương thức:
A.() - Thêm vào cuối danh sách:
A.append(x)
💡 Mẹo nhớ: Chỉ số bắt đầu từ 0, nên phần tử cuối luôn là A[len(A) - 1]. "Đếm từ 0 nên cuối là độ dài trừ 1".
⚙️ Bài tập
MỤC 1 — Câu hỏi (trang 113)
Câu 1
Đề bài: Cho danh sách A = [1, 0, "One", 9, 15, "Two", True, False]. Hãy cho biết giá trị các phần tử:
a) A[0] b) A[2] c) A[7] d) A[len(A)]
Cách 1 — Đếm chỉ số trực tiếp
Liệt kê chỉ số từng phần tử (bắt đầu từ 0):
| Chỉ số | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|---|
| Giá trị | 1 | 0 | "One" | 9 | 15 | "Two" | True | False |
- a)
A[0]= 1 - b)
A[2]= "One" - c)
A[7]= False - d)
A[len(A)]: danh sách có 8 phần tử nênlen(A) = 8, tứcA[8]. Chỉ số hợp lệ chỉ từ 0 đến 7, nên lệnh này báo lỗi (IndexError: list index out of range).
⚠️ Lưu ý thi: Nhiều bạn nhầm phần tử cuối làA[len(A)]. Đúng phải làA[len(A) - 1]. Truy cậpA[len(A)]luôn gây lỗi vượt chỉ số.
Câu 2
Đề bài: Giả sử A là một danh sách các số, mỗi lệnh sau thực hiện gì?
a) A = A + [10] b) del A[0] c) A = [100] + A d) A = [1]*25
Cách 1 — Phân tích từng lệnh
- a)
A = A + [10]: ghép danh sách A với danh sách[10]→ thêm phần tử 10 vào cuối danh sách A. - b)
del A[0]: xóa phần tử đầu tiên (chỉ số 0) của A. Sau lệnh, độ dài A giảm 1. - c)
A = [100] + A: ghép[100]đứng trước A → thêm phần tử 100 vào đầu danh sách A. - d)
A = [1]*25: phép nhân bản danh sách → tạo danh sách gồm 25 phần tử đều bằng 1:[1, 1, ..., 1].
💡 Mẹo nhớ: Với list,+là ghép nối,*là nhân bản (lặp lại nhiều lần), khác hẳn với phép cộng/nhân số.
MỤC 2 — Câu hỏi (trang 114)
Câu 1
Đề bài: Giải thích các lệnh ở mỗi câu sau thực hiện công việc gì?
a)
S = 0
for i in range(len(A)):
if A[i] % 2 == 0:
S = S + A[i]
print(S)
b)
C = 0
for i in range(len(A)):
if A[i] % 2 == 0:
C = C + 1
print(C)
Cách 1 — Phân tích vòng lặp
- a) Duyệt toàn bộ danh sách A. Với mỗi phần tử, điều kiện
A[i] % 2 == 0kiểm tra phần tử có là số chẵn hay không (chia 2 dư 0). Nếu chẵn thì cộng dồn vào S. → Chương trình tính tổng các phần tử là số chẵn của A.
- b) Cấu trúc tương tự, nhưng thay vì cộng giá trị thì mỗi lần gặp số chẵn lại tăng C thêm 1. → Chương trình đếm số lượng phần tử chẵn của A.
⚠️ Lưu ý thi: Phân biệt rõ "tổng" (cộngA[i]) và "đếm" (cộng1). Hai bài toán rất hay bị nhầm lẫn.
Câu 2
Đề bài: Cho dãy các số nguyên A, viết chương trình in ra các số chẵn của A.
Cách 1 — Duyệt theo chỉ số
A = [3, 2, 1, 5, 6, 10, 7, 12, 18]
print("Các số chẵn của A là:")
for i in range(len(A)):
if A[i] % 2 == 0:
print(A[i], end=" ")
Kết quả với dãy ví dụ: 2 6 10 12 18
Cách 2 — Duyệt trực tiếp phần tử (gọn hơn)
A = [3, 2, 1, 5, 6, 10, 7, 12, 18]
print("Các số chẵn của A là:")
for x in A:
if x % 2 == 0:
print(x, end=" ")
💡 Mẹo nhớ: Khi không cần đến chỉ số, dùngfor x in Angắn gọn và dễ đọc hơnfor i in range(len(A)).
MỤC 3 — Câu hỏi (trang 114)
Câu 1
Đề bài: Sau khi thêm một phần tử vào danh sách A bằng lệnh append() thì độ dài danh sách A thay đổi như thế nào?
Cách 1 — Giải thích
append() thêm đúng một phần tử vào cuối danh sách, nên độ dài len(A) tăng thêm 1 sau mỗi lần gọi.
Câu 2
Đề bài: Danh sách A sẽ như thế nào sau các lệnh sau?
>>> A = [2, 4, 10, 1, 0]
>>> A.append(100)
>>> del A[1]
Cách 1 — Lần theo từng bước
A = [2, 4, 10, 1, 0]→ A ban đầu.A.append(100): thêm 100 vào cuối →A = [2, 4, 10, 1, 0, 100].del A[1]: xóa phần tử chỉ số 1 (giá trị 4) →A = [2, 10, 1, 0, 100].
Kết quả: A = [2, 10, 1, 0, 100]
⚠️ Lưu ý thi: Sau khi del A[1], các phần tử phía sau dồn lên, chỉ số thay đổi theo. Phải xét lần lượt từng lệnh, không bỏ qua bước.
THỰC HÀNH (trang 115)
Nhiệm vụ 1
Đề bài: Nhập số n từ bàn phím, sau đó nhập danh sách n tên các bạn lớp em và in ra danh sách các tên đó, mỗi tên trên một dòng.
Cách 1 — Dùng append() đưa dần tên vào danh sách
A = []
n = int(input("Nhập số lượng bạn: "))
for i in range(n):
ten = input("Nhập tên bạn thứ " + str(i + 1) + ": ")
A.append(ten)
print("Danh sách lớp em:")
for i in range(n):
print(A[i])
💡 Mẹo nhớ: Trong thông báo nhập, ta viết (i + 1) để hiển thị "bạn thứ 1, 2, 3..." cho thân thiện, dù chỉ số thực bắt đầu từ 0.
Nhiệm vụ 2
Đề bài: Nhập một dãy số từ bàn phím. Tính trung bình cộng của dãy và in dãy số trên một hàng ngang.
Cách 1 — Cộng dồn khi nhập rồi chia trung bình
A = []
S = 0
n = int(input("Nhập số phần tử của dãy: "))
for i in range(n):
x = float(input("Nhập số thứ " + str(i + 1) + ": "))
A.append(x)
S = S + x
print("Trung bình cộng =", S / n)
print("Dãy số vừa nhập:")
for i in range(n):
print(A[i], end=" ")
⚠️ Lưu ý thi: Dùngfloat()(hoặcint()) để chuyển đổi dữ liệu vìinput()luôn trả về xâu ký tự. Quên bước này sẽ gây lỗi khi tính toán.
LUYỆN TẬP (trang 115)
Câu 1
Đề bài: Viết lệnh xóa phần tử cuối cùng của danh sách A bằng lệnh del.
Cách 1 — Dùng chỉ số phần tử cuối
del A[len(A) - 1]
Phần tử cuối luôn có chỉ số len(A) - 1.
Cách 2 — Dùng chỉ số âm (Python hỗ trợ)
del A[-1]
Chỉ số -1 luôn trỏ tới phần tử cuối cùng.
Câu 2
Đề bài: Có thể thêm một phần tử vào đầu danh sách được không? Nếu có thì nêu cách thực hiện.
Cách 1 — Dùng phép ghép danh sách
Có thể. Đặt phần tử mới (trong một danh sách) đứng trước A rồi ghép lại:
A = [x] + A
Cách 2 — Dùng phương thức insert()
A.insert(0, x)
insert(0, x) chèn giá trị x vào vị trí chỉ số 0 (đầu danh sách), các phần tử cũ dồn về sau.
VẬN DỤNG (trang 115)
Câu hỏi
Đề bài: Cho dãy số A. Viết chương trình tính giá trị và chỉ số của phần tử lớn nhất của A. Tương tự với bài toán tìm phần tử nhỏ nhất.
Cách 1 — Duyệt và cập nhật giá trị lớn nhất / nhỏ nhất
A = [5, 9, 2, 18, 7, 12, 3]
# Tìm phần tử lớn nhất
max_gt = A[0] # giả sử phần tử đầu lớn nhất
max_cs = 0
for i in range(len(A)):
if A[i] > max_gt:
max_gt = A[i]
max_cs = i
print("Phần tử lớn nhất là", max_gt, "tại chỉ số", max_cs)
# Tìm phần tử nhỏ nhất
min_gt = A[0]
min_cs = 0
for i in range(len(A)):
if A[i] < min_gt:
min_gt = A[i]
min_cs = i
print("Phần tử nhỏ nhất là", min_gt, "tại chỉ số", min_cs)
Với dãy ví dụ: lớn nhất là 18 tại chỉ số 3; nhỏ nhất là 2 tại chỉ số 2.
Cách 2 — Dùng hàm có sẵn max(), min() và phương thức index()
A = [5, 9, 2, 18, 7, 12, 3]
max_gt = max(A)
print("Phần tử lớn nhất là", max_gt, "tại chỉ số", A.index(max_gt))
min_gt = min(A)
print("Phần tử nhỏ nhất là", min_gt, "tại chỉ số", A.index(min_gt))
💡 Mẹo nhớ: Bài tìm max/min cần lưu cả giá trị lẫn chỉ số. Luôn khởi tạo giá trị so sánh bằng A[0] và chỉ số bằng 0, rồi duyệt từ đầu để cập nhật.
⚠️ Lưu ý thi: Khi có nhiều phần tử cùng bằng max, cách 1 (duyệt với dấu>) trả về chỉ số xuất hiện đầu tiên;index()ở cách 2 cũng vậy. Nếu đề yêu cầu lần cuối, đổi>thành>=.
🎯 Ghi nhớ: - List khởi tạo bằng[ ], phần tử có thể khác kiểu, truy cập qua chỉ số bắt đầu từ 0. - Phần tử cuối làA[len(A) - 1](hoặcA[-1]); truy cậpA[len(A)]gây lỗi. -del A[i]xóa phần tử;A.append(x)thêm vào cuối (độ dài tăng 1). - Với list:+ghép nối,*nhân bản. - Duyệt danh sách bằngfor i in range(len(A))hoặcfor x in A.
