Buổi 9: Danh sách (list)
Hôm nay em sẽ học
- Tạo list, lấy phần tử theo chỉ số, thêm phần tử
- Đọc một dãy n số trên một dòng – dạng input phổ biến nhất
- Khi nào cần lưu dữ liệu vào list
- Kỹ thuật mảng đếm
Bấm vào slide rồi dùng phím ← → để chuyển, phím F để xem toàn màn hình.
Mở toàn màn hình1. Kiến thức chính
Tạo và truy cập list
| Scratch | Python |
|---|---|
| thêm 5 vào ds | ds.append(5) |
| phần tử 1 của ds | ds[0] ← Python đếm từ 0 |
| độ dài của ds | len(ds) |
| thay phần tử 1 của ds bằng 9 | ds[0] = 9 |
Với a = [3, 1, 4, 1, 5]:
| Chỉ số | 0 | 1 | 2 | 3 | 4 |
|---|---|---|---|---|---|
| Giá trị | 3 | 1 | 4 | 1 | 5 |
| Chỉ số âm | -5 | -4 | -3 | -2 | -1 |
a[-1] là phần tử cuối. a[5] gây lỗi IndexError. [0] * n tạo list gồm n số 0.
Đọc và in một dãy số
n = int(input()) a = list(map(int, input().split())) # dãy n số trên MỘT dòng print(*a) # in các phần tử cách nhau dấu cách print(*a[::-1]) # in dãy theo thứ tự ngược
Duyệt list – hai cách
for x in a: # lấy từng GIÁ TRỊ print(x) for i in range(n): # lấy từng CHỈ SỐ (khi cần biết vị trí) print(i + 1, a[i]) # đề thi thường đánh số từ 1
Khi nào cần lưu vào list?
Khi phải nhìn lại dữ liệu: ví dụ đếm số phần tử lớn hơn trung bình cộng – phải đọc hết mới biết trung bình, rồi duyệt lại để đếm.
Mảng đếm
Khi giá trị nhỏ (ví dụ 0 ≤ aᵢ ≤ 1000), dùng cnt[v] là số lần giá trị v xuất hiện:
cnt = [0] * 1001 for x in a: cnt[x] += 1
2. Ghi nhớ và lỗi thường gặp
| Em viết | Vấn đề |
|---|---|
a = map(int, input().split()) | quên list(...) → không dùng a[0] được |
print(a[n]) | chỉ số cuối là n - 1 |
for i in range(1, n): | bỏ sót a[0] |
in vị trí i | đề đánh số từ 1 → phải in i + 1 |
3. Câu hỏi tự kiểm tra
- Với
a = [5, 8, 2, 7], các giá trịa[1],a[-1],len(a)là bao nhiêu? - Sau lệnh
a.append(4)thìalà gì? print(*[1, 2, 3])vàprint([1, 2, 3])in ra khác nhau thế nào?
4. Bài tập về nhà
Bài 1 ★ – VITRILE
Input: dòng 1 là n (1 ≤ n ≤ 10⁵); dòng 2 là dãy n số nguyên.
Output: các phần tử ở vị trí lẻ (vị trí thứ 1, 3, 5, … tính từ 1).
| Input | Output |
|---|---|
510 20 30 40 50 | 10 30 50 |
Bài 2 ★★ – DAYDUONG
Input: như bài 1.
Output: các số dương của dãy theo thứ tự ban đầu; nếu không có số dương nào thì in -1.
| Input | Output |
|---|---|
63 -1 0 7 -5 2 | 3 7 2 |
2-4 0 | -1 |
Bài 3 ★★ – DAYDX
Input: như bài 1.
Output: YES nếu dãy đối xứng (a₁ = aₙ, a₂ = aₙ₋₁, …), ngược lại NO.
| Input | Output |
|---|---|
51 2 3 2 1 | YES |
41 2 2 3 | NO |
Bài 4 ★★★ (thử thách) – DICHVONG
Dịch dãy sang phải k vị trí theo vòng tròn: phần tử cuối dãy chuyển lên đầu, lặp lại k lần.
Input: dòng 1 là n và k (1 ≤ n ≤ 10⁵, 0 ≤ k ≤ 10⁹); dòng 2 là dãy n số.
Output: dãy sau khi dịch.
| Input | Output |
|---|---|
5 21 2 3 4 5 | 4 5 1 2 3 |
3 47 8 9 | 9 7 8 |
k % n và cắt list a[x:], a[:x]..py đặt tên theo tên bài. Chạy thử với tất cả ví dụ trước khi nộp!Chưa mở đáp án
Đáp án sẽ được mở sau khi các em nộp bài tập về nhà.
Chưa mở đáp án
Đáp án sẽ được mở sau khi các em nộp bài tập về nhà.