Buổi 9: Danh sách (list)

Hôm nay em sẽ học

  1. Tạo list, lấy phần tử theo chỉ số, thêm phần tử
  2. Đọc một dãy n số trên một dòng – dạng input phổ biến nhất
  3. Khi nào cần lưu dữ liệu vào list
  4. 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ình

1. Kiến thức chính

Tạo và truy cập list

ScratchPython
thêm 5 vào dsds.append(5)
phần tử 1 của dsds[0] ← Python đếm từ 0
độ dài của dslen(ds)
thay phần tử 1 của ds bằng 9ds[0] = 9

Với a = [3, 1, 4, 1, 5]:

Chỉ số01234
Giá trị31415
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ếtVấ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

  1. Với a = [5, 8, 2, 7], các giá trị a[1], a[-1], len(a) là bao nhiêu?
  2. Sau lệnh a.append(4) thì a là gì?
  3. 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).

InputOutput
5
10 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.

InputOutput
6
3 -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.

InputOutput
5
1 2 3 2 1
YES
4
1 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.

InputOutput
5 2
1 2 3 4 5
4 5 1 2 3
3 4
7 8 9
9 7 8
Gợi ý: dịch n lần thì dãy quay về như cũ. Với k = 10⁹ không thể dịch từng lần – hãy dùng k % n và cắt list a[x:], a[:x].
Cách nộp bài: mỗi bài một file .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à.

Zalo