Danh sách (list)

Buổi 9

Python cho Tin học trẻ · Bảng B (THCS)

Buổi 9 – Danh sách (list)1 / 23

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
Buổi 9 – Danh sách (list)2 / 23

Khởi động

Trong Scratch, em đã dùng Danh sách để làm gì?

  • Lưu điểm của cả lớp
  • Lưu danh sách từ cho trò chơi đoán chữ
  • …
Một biến chứa một giá trị. Một list chứa nhiều giá trị.
Buổi 9 – Danh sách (list)3 / 23

Phần 1: Tạo và dùng list

Một dãy ô có đánh số
Buổi 9 – Danh sách (list)4 / 23

Từ Scratch sang Python

ScratchPython
thêm 5 vào dsds.append(5)
phần tử 1 của dsds[0]
độ dài của dslen(ds)
thay phần tử 1 của ds bằng 9ds[0] = 9
Python đếm từ 0, Scratch đếm từ 1!
Buổi 9 – Danh sách (list)5 / 23

Chỉ số của list

a = [3, 1, 4, 1, 5]

Chỉ số01234
Giá trị31415
Chỉ số âm-5-4-3-2-1
  • a[0] là 3, a[4] là 5
  • a[-1] là phần tử cuối cùng
  • a[5] → lỗi IndexError: list index out of range
Buổi 9 – Danh sách (list)6 / 23

Thử các lệnh

a = [3, 1, 4, 1, 5]
print(a[0], a[-1])
print(len(a))
a.append(9)
print(a)
a[0] = 7
print(a)
b = [0] * 4
print(b)
3 5
5
[3, 1, 4, 1, 5, 9]
[7, 1, 4, 1, 5, 9]
[0, 0, 0, 0]
Buổi 9 – Danh sách (list)7 / 23

Phần 2: Đọc và duyệt dãy

Câu thần chú số 2
Buổi 9 – Danh sách (list)8 / 23

Đọc dãy n số trên một dòng

Đề: "Dòng 1 chứa n. Dòng 2 chứa n số nguyên a₁, a₂, …, aₙ."

n = int(input())
a = list(map(int, input().split()))
print(*a)
5
3 1 4 1 5
3 1 4 1 5
print(*a) in các phần tử cách nhau dấu cách, không có ngoặc vuông.
Buổi 9 – Danh sách (list)9 / 23

Duyệt list – hai cách

Lấy từng giá trị

for x in a:
    print(x)

Dùng khi chỉ cần giá trị.

Lấy từng chỉ số

for i in range(n):
    print(i + 1, a[i])

Dùng khi cần biết vị trí.

Đề thi thường đánh số từ 1 → in i + 1.
Buổi 9 – Danh sách (list)10 / 23

Phần 3: Vì sao cần list?

Có những bài phải nhìn lại dữ liệu
Buổi 9 – Danh sách (list)11 / 23

Đếm số lớn hơn trung bình cộng

  • Phải đọc hết dãy mới biết trung bình cộng
  • Rồi phải duyệt lại từng số để đếm
  • Không lưu vào list thì các số đã đọc bị mất!
n = int(input())
a = list(map(int, input().split()))
tb = sum(a) / n
dem = 0
for x in a:
    if x > tb:
        dem += 1
print(dem)
Buổi 9 – Danh sách (list)12 / 23

Mảng đếm

Khi các giá trị nhỏ (ví dụ 0 ≤ aᵢ ≤ 1000): dùng cnt[v] = số lần giá trị v xuất hiện.

cnt = [0] * 1001
for x in a:
    cnt[x] += 1
print(cnt[3])
Dãy a3 1 3 2 1 3
cnt[1]2
cnt[2]1
cnt[3]3
Buổi 9 – Danh sách (list)13 / 23

Luyện tập

Bài ★ cả lớp · Bài ★★★ thử thách
Buổi 9 – Danh sách (list)14 / 23

Bài 1 ★ – INNGUOC

Input: dòng 1 là n (n ≤ 10⁵); dòng 2 là dãy n số nguyên.

Output: dãy theo thứ tự ngược lại.

InputOutput
5 3 1 4 1 55 1 4 1 3
Buổi 9 – Danh sách (list)15 / 23

Bài 2 ★ – TONGDAY

Input: n (n ≤ 10⁵), dãy n số nguyên (|aᵢ| ≤ 10⁹).

Output: tổng các phần tử.

InputOutput
4 3 -1 4 1016
Tự viết vòng lặp, sau đó so sánh với sum(a).
Buổi 9 – Danh sách (list)16 / 23

Bài 3 ★ – DEMCHAN

Input: n, dãy n số nguyên.

Output: số phần tử chẵn.

InputOutput
6 2 7 4 -6 9 04
Buổi 9 – Danh sách (list)17 / 23

Bài 4 ★★ – VITRI

Input: dòng 1 là n và x; dòng 2 là dãy n số.

Output: các vị trí (đánh số từ 1) có giá trị bằng x, hoặc -1 nếu không có.

InputOutput
6 2 2 5 2 7 2 11 3 5
3 9 1 2 3-1
Buổi 9 – Danh sách (list)18 / 23

Bài 5 ★★ – LONHONTB

Input: n, dãy n số nguyên.

Output: số phần tử lớn hơn trung bình cộng của dãy.

InputOutput
5 1 2 3 4 101
Mẹo tránh số thực: aᵢ > tổng ÷ n tương đương aᵢ × n > tổng.
Buổi 9 – Danh sách (list)19 / 23

Bài 6 ★★★ – KHACNHAU

Input: n (n ≤ 10⁵), dãy n số (0 ≤ aᵢ ≤ 1000).

Output: số giá trị khác nhau, và giá trị xuất hiện nhiều lần nhất (nếu nhiều giá trị cùng nhiều nhất thì in giá trị nhỏ nhất).

InputOutput
7 3 1 3 2 1 3 23 3
4 5 5 2 22 2
Buổi 9 – Danh sách (list)20 / 23

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 → in i + 1
Buổi 9 – Danh sách (list)21 / 23

Tóm tắt buổi 9

n = int(input())
a = list(map(int, input().split()))
for i in range(n):
    ... a[i] ...
print(*a)
  • Chỉ số từ 0 đến n − 1
  • a[-1]: phần tử cuối
  • append, len, sum
  • [0] * n: list n số 0
  • Mảng đếm: cnt[x] += 1
Buổi 9 – Danh sách (list)22 / 23

Bài về nhà

  1. Nhập dãy, in các phần tử ở vị trí lẻ (vị trí 1, 3, 5…).
  2. Tạo dãy mới gồm các số dương của dãy ban đầu và in ra (nếu không có in -1).
  3. Kiểm tra dãy có đối xứng không (a₁ = aₙ, a₂ = aₙ₋₁, …).
Buổi 9 – Danh sách (list)23 / 23
← → chuyển slide · F toàn màn hình