Mảng (array) và danh sách: lưu nhiều giá trị trong một biến

  • author-image

    Nguyễn Đình Cường

  • blog-tag
  • blog-comment 0 comment
  • created-date 09 Nov, 2026
blog-thumbnail

Một lớp học có 40 học sinh, bạn không thể tạo 40 biến riêng lẻ để lưu điểm. Mảng và danh sách ra đời để giải quyết đúng vấn đề đó: gom nhiều giá trị vào một cấu trúc có thứ tự.

Mảng và danh sách là gì?

Mảng (array) là một dãy các phần tử xếp liên tiếp, mỗi phần tử có một chỉ số (index) bắt đầu từ 0. Trong Python, cấu trúc tương tự gọi là list, còn JavaScript gọi là array.

diem = [8, 6.5, 9, 7]
print(diem[0])    # 8     (phần tử đầu)
print(diem[3])    # 7     (phần tử cuối)
print(diem[-1])   # 7     (Python cho phép đếm từ cuối)
print(len(diem))  # 4

Truy cập phần tử bằng chỉ số cực nhanh vì máy tính tính được vị trí ngay lập tức, bất kể mảng dài bao nhiêu. Đó là điểm mạnh lớn nhất của mảng.

Các thao tác thường dùng

ds = [3, 1, 4]
ds.append(5)         # thêm cuối: [3, 1, 4, 5]
ds.insert(1, 9)      # chèn vào vị trí 1: [3, 9, 1, 4, 5]
ds.remove(4)         # xóa giá trị 4
ds[0] = 100          # sửa phần tử
ds.sort()            # sắp xếp tăng dần
print(ds)

Trong JavaScript, tương ứng là push, splice, sort, length. Tên khác nhau nhưng ý tưởng giống nhau, bạn chỉ cần tra tài liệu khi chuyển ngôn ngữ.

Duyệt qua mảng

Hầu như mọi bài toán trên mảng đều bắt đầu bằng việc duyệt:

diem = [8, 6.5, 9, 7]
tong = 0
for d in diem:
    tong += d
print("Điểm trung bình:", tong / len(diem))

for i, d in enumerate(diem):
    print("Bạn thứ", i + 1, "được", d)

Dùng enumerate khi cần cả chỉ số lẫn giá trị, tiện hơn việc tự đếm.

Cắt lát (slicing) và danh sách hai chiều

Python cho phép lấy một đoạn con rất gọn:

so = [10, 20, 30, 40, 50]
print(so[1:4])   # [20, 30, 40]  (từ 1 đến trước 4)
print(so[:2])    # [10, 20]
print(so[::-1])  # đảo ngược danh sách

Một mảng có thể chứa mảng khác, tạo thành bảng hai chiều như bàn cờ hay ma trận:

luoi = [[1, 2, 3],
        [4, 5, 6]]
print(luoi[1][2])   # 6 (hàng 1, cột 2)

Ưu và nhược điểm của mảng

Thao tácĐánh giá
Truy cập theo chỉ sốRất nhanh
Thêm vào cuốiNhanh
Chèn hoặc xóa ở giữaChậm hơn, phải dời các phần tử phía sau
Tìm một giá trị chưa biết vị tríPhải duyệt từng phần tử

Vì chèn giữa tốn công, khi cần chèn xóa nhiều bạn có thể cân nhắc cấu trúc khác như danh sách liên kết. Còn nếu cần tra cứu theo khóa, từ điển hay bảng băm thường phù hợp hơn.

Những lỗi người mới hay gặp

  1. Truy cập ngoài phạm vi: mảng 4 phần tử thì chỉ số hợp lệ là 0 đến 3; gọi diem[4] gây lỗi IndexError.
  2. Nhầm bản sao với tham chiếu: b = a trong Python không tạo bản sao, hai biến cùng trỏ vào một danh sách. Muốn sao chép, dùng b = a.copy() hoặc b = a[:].
  3. Sửa mảng khi đang duyệt làm bỏ sót phần tử.
  4. Quên mảng rỗng: tính trung bình mảng rỗng sẽ chia cho 0.

Bài tập gợi ý

  • Tìm phần tử lớn nhất và nhỏ nhất.
  • Đếm số lần xuất hiện của một giá trị.
  • Đảo ngược mảng mà không dùng hàm có sẵn.
  • Loại bỏ phần tử trùng lặp.

Ví dụ: thống kê điểm lớp học

diem = [7.5, 9, 6, 8.5, 4, 10, 7]

lon_nhat = max(diem)
nho_nhat = min(diem)
trung_binh = sum(diem) / len(diem)
tren_tb = [d for d in diem if d > trung_binh]
dat = sum(1 for d in diem if d >= 5)

print(f"Cao nhất {lon_nhat}, thấp nhất {nho_nhat}")
print(f"Trung bình {trung_binh:.2f}")
print(f"Trên trung bình: {tren_tb}")
print(f"Số bạn đạt: {dat}/{len(diem)}")

Đoạn code kết hợp duyệt, tính toán và lọc, ba thao tác bạn sẽ dùng với mảng hầu như mỗi ngày. Hãy thử viết lại mà không dùng max, min, sum để hiểu chúng hoạt động thế nào bên trong, rồi so sánh với phiên bản dùng hàm có sẵn: ngắn hơn, ít lỗi hơn, và đó là lý do ta nên dùng thư viện chuẩn khi đã hiểu nguyên lý.

Kết luận

Mảng là cấu trúc dữ liệu đầu tiên và quan trọng nhất bạn sẽ học. Nắm chắc chỉ số, duyệt, thêm xóa và cắt lát, bạn đã đủ nền để học các cấu trúc phức tạp hơn như stack, queue hay cây. Hãy luyện mỗi ngày một bài nhỏ trên mảng để thành phản xạ.

Nếu cần một lộ trình rõ ràng thay vì tự mò mẫm, codebem.com có nhiều khóa học phù hợp cho người mới.

author_photo
Nguyễn Đình Cường

0 comment