Mục tiêu bài học
Sau khi hoàn thành bài học này, học sinh sẽ có khả năng:
- Về kiến thức: Biết được kiểu dữ liệu danh sách (list), cách khởi tạo và truy cập từng phần tử của danh sách.
- Về kĩ năng:
- Biết và thực hiện được cách duyệt các phần tử của danh sách bằng lệnh for.
- Thực hành được một số phương thức đơn giản trên dữ liệu danh sách như thêm, xoá, thay đổi phần tử.
- Về phẩm chất: Hình thành ý thức trách nhiệm, tính cẩn thận, chăm chỉ và chuyên cần để hoàn thành nhiệm vụ học tập.
Hoạt động khởi động
Trong các bài trước, chúng ta đã làm quen với các kiểu dữ liệu cơ bản như số nguyên, số thực, xâu kí tự. Các kiểu dữ liệu này là dạng “đơn”, tức là mỗi biến chỉ lưu được một giá trị. Tuy nhiên, trong thực tế, chúng ta thường có nhu cầu lưu trữ một tập hợp nhiều giá trị, ví dụ như danh sách học sinh trong lớp, danh sách các món đồ cần mua, hay một dãy các số đo nhiệt độ. Kiểu dữ liệu danh sách (list) trong Python ra đời để giải quyết nhu cầu này.
Em hãy tìm một số ví dụ về dữ liệu kiểu danh sách thường gặp trên thực tế.
Một số ví dụ về dữ liệu kiểu danh sách trong thực tế bao gồm:
Danh sách học sinh của một lớp.
Danh sách các món hàng cần đi chợ.
Danh sách các số điện thoại trong danh bạ.
Một dãy các số liệu thống kê (ví dụ: nhiệt độ các ngày trong tháng).
1. Kiểu dữ liệu danh sách
Kiểu dữ liệu danh sách (list) trong Python được dùng để lưu trữ một dãy các giá trị.
- Khởi tạo: Danh sách được tạo bằng cách đặt các phần tử bên trong cặp dấu ngoặc vuông [], các phần tử cách nhau bởi dấu phẩy.
- Đặc điểm: Các phần tử trong một danh sách có thể có các kiểu dữ liệu khác nhau (số nguyên, số thực, xâu kí tự,…).
- Truy cập: Ta có thể truy cập từng phần tử của danh sách thông qua chỉ số (index). Chỉ số được đánh số từ 0.
- Cú pháp:
<tên_danh_sách>[<chỉ_số>]
- Cú pháp:
- Thao tác cơ bản:
- Thay đổi giá trị: Dùng lệnh gán để thay đổi giá trị của một phần tử. Ví dụ: A[1] = “mới”
- Xóa phần tử: Dùng lệnh del. Ví dụ:
del A[4]
- Lấy độ dài: Dùng hàm
len(<tên_danh_sách>)
để biết số lượng phần tử. - Ghép danh sách: Dùng phép toán + để nối hai danh sách với nhau.
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)]
A = [1, 0, "One", 9, 15, "Two", True, False]
. Hãy cho biết giá trị các phần tử:
a) A[0] có giá trị là 1.
b) A[2] có giá trị là “One”.
c) A[7] có giá trị là False.
d) A[len(A)] sẽ gây ra lỗi chỉ số (index error).
⚠️ Vì độ dài của danh sách A là 8 (len(A) bằng 8), nên chỉ số hợp lệ chạy từ 0 đến 7. A[8]
nằm ngoài phạm vi hợp lệ.
Giả sử A là một danh sách các số, mỗi lệnh sau thực hiện công việc gì?
a) A = A + [10],
b) del A[0],
c) A = [100] + A,
d) A = A[1]*25
a) A = A + [10]
: Bổ sung phần tử có giá trị 10 vào cuối danh sách A.
b) del A[0]
: Xóa phần tử đầu tiên (có chỉ số 0) của danh sách A.
c) A = [100] + A
: Thêm số 100 vào đầu danh sách A.
d) A = A[1]*25
: Lệnh này sẽ gây lỗi. Phép nhân * không được định nghĩa cho một danh sách với một số nguyên theo cách này. Nếu A[1] là một số, thì A sẽ trở thành một số, không còn là danh sách. Nếu A là một biến mới thì nó sẽ được gán giá trị bằng tích của phần tử thứ hai của danh sách cũ với 25.
Lưu ý: trong trường hợp d, câu lệnh này sẽ thiết lập biến A mới, không còn là danh sách nữa mà là một giá trị số bằng tích của phần tử thứ hai của danh sách A ban đầu với 25.
2. Duyệt các phần tử của danh sách
Để xử lí tất cả các phần tử trong một danh sách, ta cần duyệt qua chúng một cách lần lượt. Cách phổ biến nhất là dùng vòng lặp for kết hợp với hàm range().
Vòng lặp for i in range(len(A)) sẽ tạo ra một biến i chạy qua các chỉ số hợp lệ của danh sách A, từ 0 đến len(A) – 1. Bên trong vòng lặp, ta có thể dùng A[i] để truy cập và xử lí từng phần tử.
Ví dụ: In ra các phần tử của danh sách
A = [1, 2, 3, 4, 5]
for i in range(len(A)):
print(A[i], end=" ")
# Kết quả: 1 2 3 4 5
Giải thích cách làm việc của các đoạn mã sau đây?
a)
S = 0
for i in range(len(A)):
if A[i] > 0:
S = S + A[i]
print(S)
✅ Đoạn lệnh này tính tổng các số dương có trong danh sách A.
b)
C = 0
for i in range(len(A)):
if A[i] > 0:
C = C + 1
print(C)
✅ Đoạn lệnh này đếm số lượng các số dương có trong danh sách A.
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.
Chương trình có thể được viết như sau:
# Giả sử A đã được cho trước
A = [1, 5, 7, 4, 18, 20, 23]
# Duyệt qua từng phần tử của danh sách A
for i in range(len(A)):
# Kiểm tra nếu phần tử là số chẵn
if A[i] % 2 == 0:
print(A[i], end=" ")
# Kết quả: 4 18 20
3. Thêm phần tử vào danh sách
Python cung cấp các lệnh đặc biệt được thiết kế riêng cho kiểu dữ liệu danh sách, gọi là phương thức (method).
- Cú pháp:
<tên_danh_sách>.<tên_phương_thức>()
- Phương thức
append()
: Dùng để thêm một phần tử vào cuối danh sách.
Ví dụ:
A = [1, 2]
A.append(10)
print(A)
# Kết quả: [1, 2, 10]
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?
Độ dài của danh sách A (giá trị trả về bởi len(A)) sẽ tăng lên một đơn vị.
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]
A = [2, 4, 10, 1, 0]: A được khởi tạo.
A.append(100): Thêm 100 vào cuối, A trở thành [2, 4, 10, 1, 0, 100].
del A[1]: Xóa phần tử ở chỉ số 1 (là số 4).
Kết quả cuối cùng, A sẽ là: [2, 10, 1, 0, 100].
Luyện tập
1. Viết lệnh xoá phần tử cuối cùng của danh sách A bằng lệnh del.
Để xoá phần tử cuối cùng, chúng ta cần biết chỉ số của nó. Chỉ số của phần tử cuối cùng là len(A) – 1.
Vậy lệnh để xoá là:
del A[len(A) – 1]
2. 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ó thể. Chúng ta có thể dùng phép toán ghép danh sách + để thực hiện việc này. Ta tạo một danh sách mới chỉ chứa phần tử cần thêm, sau đó ghép nó với danh sách A ban đầu.
Giả sử phần tử cần thêm là x, cách thực hiện như sau:
A = [x] + A
Vận dụng
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.
Ta có thể giả sử phần tử đầu tiên là lớn nhất, sau đó duyệt qua các phần tử còn lại. Nếu gặp phần tử nào lớn hơn giá trị lớn nhất hiện tại, ta cập nhật lại giá trị lớn nhất và chỉ số của nó.
Chương trình tìm phần tử lớn nhất:
# Giả sử A là danh sách cho trước
A = [1, 0, 10, 9, -1, 14, 7, 8]
# Giả sử phần tử đầu tiên là lớn nhất
max_value = A[0]
max_index = 0
# Duyệt từ phần tử thứ hai trở đi
for i in range(1, len(A)):
if A[i] > max_value:
max_value = A[i]
max_index = i
print("Phần tử lớn nhất là", max_value, "tại vị trí (chỉ số)", max_index)
# Kết quả: Phần tử lớn nhất là 14 tại vị trí (chỉ số) 5
Tương tự cho bài toán tìm phần tử nhỏ nhất, ta chỉ cần thay đổi logic so sánh từ > thành <:
# Giả sử A là danh sách cho trước
A = [1, 0, 10, 9, -1, 14, 7, 8]
min_value = A[0]
min_index = 0
for i in range(1, len(A)):
if A[i] < min_value:
min_value = A[i]
min_index = i
print("Phần tử nhỏ nhất là", min_value, "tại vị trí (chỉ số)", min_index)
# Kết quả: Phần tử nhỏ nhất là -1 tại vị trí (chỉ số) 4