Skip to content

Mảng hai chiều

Tóm lược nội dung

Bài này trình bày những khái niệm về mảng hai chiều.

Đặt vấn đề

Làm thế nào xử lý khi dữ liệu không phải là một dãy, mà là một bảng số liệu?

Khái quát về mảng

Tương tự bài học trước, mảng là cấu trúc dữ liệu dùng để lưu trữ và xử lý tập hợp các phần tử.

Bài học này đề cập mảng hai chiều.

Mảng hai chiều

Mảng hai chiều dùng để lưu trữ và xử lý dữ liệu theo dạng lưới, dạng bảng hoặc ma trận, gồm nhiều hàng và nhiều cột.

Ví dụ:
Một số hình ảnh của mảng hai chiều là:

  • Bàn cờ vua
  • Bảng số Sudoku
  • Bảng tính Excel

Trong mảng hai chiều, số phần tử của mỗi hàng ứng với số cột của mảng. Nói cách khác, các hàng đều có số phần tử bằng nhau, hoặc các hàng đều có số cột như nhau.

Minh họa mảng hai chiều B

Minh họa mảng hai chiều B

Mảng hai chiều có thể được xem là mảng của các mảng, nghĩa là, mỗi phần tử của mảng hai chiều là mảng một chiều.

Khởi tạo

Tương tự mảng một chiều, kiểu list của Python cho phép khởi tạo bằng cách liệt kê phần tử hoặc list comprehension.

Khi liệt kê, ta sử dụng các cặp ngoặc vuông lồng nhau: [[ ], [ ], ... ]

Ví dụ 1:
Khởi tạo mảng hai chiều bằng cách liệt kê phần tử.

1
2
3
4
if __name__ == '__main__':
    # Mảng B gồm 3 hàng và 4 cột
    B = [[1, 7, 4, 0], [9, 4, 8, 8], [2, 4, 5, 5]]
    print(B)

Output:

[[1, 7, 4, 0], [9, 4, 8, 8], [2, 4, 5, 5]]

Ví dụ 2:
Khởi tạo mảng một chiều bằng toán tử *.

1
2
3
4
5
6
7
8
if __name__ == '__main__':
    # Khai báo số hàng và số cột
    rows = 3
    cols = 4

    # Mảng zero_array gồm các phần tử có giá trị 0
    zero_array = [[0] * cols] * rows
    print(zero_array)

Output:

[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]

Ví dụ 3:
Khởi tạo mảng hai chiều bằng cú pháp list comprehension.

1
2
3
4
5
6
7
8
if __name__ == '__main__':
    # Khai báo số hàng và số cột
    rows = 3
    cols = 4

    # Mảng zero_array gồm các phần tử có giá trị 0
    one_array = [[1 for c in range(cols)] for r in range(rows)]
    print(one_array)

Output:

[[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]]

Truy xuất phần tử

Mỗi phần tử của mảng hai chiều được truy xuất bằng hai chỉ số, gọi là chỉ số hàngchỉ số cột, đặt trong hai cặp ngoặc vuông [][], chỉ số hàng nằm trước, chỉ số cột nằm sau.

Ví dụ 4:
In ra màn hình giá trị của một vài phần tử.

1
2
3
4
5
6
7
8
9
if __name__ == '__main__':
    # Khởi tạo mảng B
    B = [[1, 7, 4, 0], [9, 4, 8, 8], [2, 4, 5, 5]]

    # In ra phần tử đầu tiên
    print(B[0][0])

    # In ra phần tử cuối cùng
    print(B[2][3])

Output:

1
5

Câu hỏi 1

Cũng với mảng B của ví dụ 3, dòng lệnh print(B[1][2]) sẽ in ra màn hình kết quả gì?



Đáp án

B[1][2] là phần tử ở hàng giữa, có chỉ số cột là 2. Như vậy, kết quả in ra là 8.

Ví dụ 5:
In ra số hàng và số cột của mảng hai chiều.

1
2
3
4
5
6
7
8
9
if __name__ == '__main__':
    # Khởi tạo mảng B
    B = [[1, 7, 4, 0], [9, 4, 8, 8], [2, 4, 5, 5]]

    # In ra số hàng của mảng B
    print(len(B))

    # In ra số cột của mảng B
    print(len(B[0]))

Output:

3
4

Câu hỏi 2

Cũng với mảng B của ví dụ 4, dòng lệnh print(len(B[1])) sẽ in ra màn hình kết quả gì?



Đáp án

B[1] là hàng có chỉ số 1 của mảng B. Vì các hàng đều có số cột bằng nhau, nên lệnh len(B[1]) là tương đương với len(B[0]).
Như vậy, kết quả in ra là 4.

Duyệt mảng

Khi duyệt mảng hai chiều, ta thường sử dụng hai vòng lặp lồng nhau:

  • Vòng lặp ngoài dùng để duyệt các hàng.
  • Vòng lặp trong dùng để duyệt các cột, tức các phần tử của hàng đang duyệt.

Ví dụ 6:
In mảng hai chiều theo dạng hàng và cột.

if __name__ == '__main__':
    B = [[1, 7, 4, 0], [9, 4, 8, 8], [2, 4, 5, 5]]

    # Khai báo số hàng và số cột
    rows = 3
    cols = 4

    # Duyệt từ hàng đầu đến hàng cuối. Ứng với mỗi hàng r:
    # Duyệt từ cột đầu đến cột cuối
    for r in range(rows):        
        for c in range(cols):       
            # In ra phần tử nằm ở hàng r và cột c, kèm theo khoảng trắng
            print(B[r][c], end=' ')

        # Xuống dòng sau khi đã in hết các cột
        print()

Output:

1 7 4 0 
9 4 8 8 
2 4 5 5 

Câu hỏi 3

Bạn hãy chỉnh sửa các dòng lệnh của vòng lặp để in ra màn hình tất cả phần tử của mảng B trên cùng một dòng.



Đáp án
1
2
3
for r in range(rows):
    for c in range(cols):
        print(B[r][c], end=' ')

Sơ đồ tóm tắt nội dung

Sơ đồ tóm tắt mảng hai chiều

Google Colab

Các đoạn mã trong bài này được đặt tại Google Colab để bạn có thể thử nghiệm theo cách của riêng mình.

Some English words

Vietnamese Tiếng Anh
cột column
hàng row
mảng của mảng array of arrays
mảng hai chiều two-dimensional array

Bài tập thực hành

  1. Bài tập 2D-array-1

  2. Chưa có