Skip to content

🔄 10.2 Duyệt và xử lý list 2 chiều

📖 Giới thiệu

Duyệt qua list 2 chiều là kỹ năng cốt lõi để xử lý dữ liệu dạng bảng. Python cung cấp nhiều cách để duyệt từng phần tử, từng hàng, từng cột một cách linh hoạt.

Mục tiêu bài học:

  • Duyệt list 2 chiều theo nhiều cách
  • Xử lý dữ liệu theo hàng và cột
  • Thực hiện tính toán trên ma trận

🔧 Cú pháp

Duyệt theo hàng:

python
for hang in list_2d:
    print(hang)
    
# Hoặc dùng index
for i in range(len(list_2d)):
    print(list_2d[i])

Duyệt từng phần tử:

python
for i in range(len(list_2d)):
    for j in range(len(list_2d[i])):
        print(list_2d[i][j])

🔬 Phân tích & Giải thích chi tiết

1. 📊 Duyệt theo hàng

python
ma_tran = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]

# Cách 1: Duyệt trực tiếp
print("Duyệt theo hàng:")
for hang in ma_tran:
    print(f"Hàng: {hang}")

# Cách 2: Dùng index
print("\nDùng index:")
for i in range(len(ma_tran)):
    print(f"Hàng {i}: {ma_tran[i]}")

2. 📋 Duyệt theo cột

python
# Lấy cột đầu tiên
cot_0 = []
for i in range(len(ma_tran)):
    cot_0.append(ma_tran[i][0])
print(f"Cột 0: {cot_0}")

# Duyệt tất cả cột
so_cot = len(ma_tran[0])
for j in range(so_cot):
    cot = []
    for i in range(len(ma_tran)):
        cot.append(ma_tran[i][j])
    print(f"Cột {j}: {cot}")

3. 🎯 Duyệt từng phần tử

python
# Duyệt và in từng phần tử
for i in range(len(ma_tran)):
    for j in range(len(ma_tran[i])):
        print(f"[{i}][{j}] = {ma_tran[i][j]}")

# In dạng ma trận
for hang in ma_tran:
    for so in hang:
        print(so, end=" ")
    print()  # Xuống dòng

💻 Ví dụ minh họa

Ví dụ 1: Tính điểm trung bình theo học sinh

python
# Bảng điểm [Tên, Toán, Văn, Anh]
bang_diem = [
    ["An", 8, 7, 9],
    ["Bình", 6, 8, 7],
    ["Chi", 9, 6, 8],
    ["Dũng", 7, 9, 6]
]

print("📊 TÍNH ĐIỂM TRUNG BÌNH")
print("=" * 35)

# Tính TB cho từng học sinh
print(f"{'Tên':<8} {'Toán':<6} {'Văn':<6} {'Anh':<6} {'TB':<6}")
print("-" * 35)

for hs in bang_diem:
    ten = hs[0]
    toan = hs[1]
    van = hs[2]
    anh = hs[3]
    
    # Tính trung bình
    tb = (toan + van + anh) / 3
    
    print(f"{ten:<8} {toan:<6} {van:<6} {anh:<6} {tb:<6.1f}")

print("-" * 35)

# Tính TB theo môn
tong_toan = 0
tong_van = 0
tong_anh = 0
so_hs = len(bang_diem)

for hs in bang_diem:
    tong_toan += hs[1]
    tong_van += hs[2]
    tong_anh += hs[3]

print(f"TB Toán: {tong_toan/so_hs:.1f}")
print(f"TB Văn: {tong_van/so_hs:.1f}")
print(f"TB Anh: {tong_anh/so_hs:.1f}")

Ví dụ 2: Tìm kiếm trong ma trận

python
# Ma trận số
so_matrix = [
    [1, 5, 3],
    [8, 2, 7],
    [4, 9, 6]
]

print("🔍 TÌM KIẾM TRONG MA TRẬN")
print("=" * 30)

# Hiển thị ma trận
print("Ma trận:")
for hang in so_matrix:
    for so in hang:
        print(f"{so:3}", end="")
    print()

# Tìm số lớn nhất
so_max = 0
vi_tri_max = [0, 0]

for i in range(len(so_matrix)):
    for j in range(len(so_matrix[i])):
        if so_matrix[i][j] > so_max:
            so_max = so_matrix[i][j]
            vi_tri_max = [i, j]

print(f"\nSố lớn nhất: {so_max}")
print(f"Vị trí: hàng {vi_tri_max[0]}, cột {vi_tri_max[1]}")

# Tính tổng từng hàng
print("\nTổng từng hàng:")
for i in range(len(so_matrix)):
    tong_hang = 0
    for j in range(len(so_matrix[i])):
        tong_hang += so_matrix[i][j]
    print(f"Hàng {i}: {tong_hang}")

# Tính tổng từng cột
print("\nTổng từng cột:")
so_cot = len(so_matrix[0])
for j in range(so_cot):
    tong_cot = 0
    for i in range(len(so_matrix)):
        tong_cot += so_matrix[i][j]
    print(f"Cột {j}: {tong_cot}")

Ví dụ 3: Game đánh dấu ô

python
# Bảng 4x4 ban đầu
ban_danh_dau = [
    [0, 0, 0, 0],
    [0, 0, 0, 0],
    [0, 0, 0, 0],
    [0, 0, 0, 0]
]

def ve_bang(bang):
    print("\n  0 1 2 3")
    for i in range(len(bang)):
        print(f"{i}", end=" ")
        for j in range(len(bang[i])):
            if bang[i][j] == 0:
                print(".", end=" ")
            else:
                print("X", end=" ")
        print()

print("🎮 GAME ĐÁNH DẤU Ô")
print("=" * 25)

ve_bang(ban_danh_dau)

# Đánh dấu vài ô
ban_danh_dau[1][1] = 1
ban_danh_dau[2][2] = 1
ban_danh_dau[1][2] = 1

print("\nSau khi đánh dấu:")
ve_bang(ban_danh_dau)

# Đếm số ô đã đánh dấu
dem = 0
for hang in ban_danh_dau:
    for o in hang:
        if o == 1:
            dem += 1

print(f"\nĐã đánh dấu: {dem} ô")

# Kiểm tra hàng nào có đủ 3 X
print("\nKiểm tra hàng:")
for i in range(len(ban_danh_dau)):
    dem_x = 0
    for j in range(len(ban_danh_dau[i])):
        if ban_danh_dau[i][j] == 1:
            dem_x += 1
    print(f"Hàng {i}: {dem_x} X")

🏋️ Thực hành

Bài tập 1: Tính tổng ma trận

python
# Tính tổng tất cả phần tử
so = [
    [1, 2, 3],
    [4, 5, 6]
]

tong = 0
for hang in so:
    for so_item in hang:
        tong += so_item

print(f"Tổng: {tong}")

Bài tập 2: In ma trận ngược

python
# In ma trận từ dưới lên
ma_tran = [
    [1, 2],
    [3, 4],
    [5, 6]
]

print("Ma trận ngược:")
for i in range(len(ma_tran)-1, -1, -1):
    print(ma_tran[i])

Bài tập 3: Đếm số chẵn

python
# Đếm số chẵn trong ma trận
so = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]

dem_chan = 0
for hang in so:
    for so_item in hang:
        if so_item % 2 == 0:
            dem_chan += 1

print(f"Có {dem_chan} số chẵn")

📋 Tóm tắt

Các cách duyệt list 2D:

Phương phápCú phápKhi nào dùng
Duyệt hàngfor hang in list:Xử lý từng hàng
Duyệt indexfor i in range(len):Cần biết vị trí
Duyệt lồngfor i: for j:Xử lý từng phần tử

Mẫu code thường dùng:

python
# Duyệt toàn bộ
for i in range(len(list_2d)):
    for j in range(len(list_2d[i])):
        # Xử lý list_2d[i][j]

# Duyệt theo cột
for j in range(len(list_2d[0])):
    for i in range(len(list_2d)):
        # Xử lý list_2d[i][j]

Ứng dụng thực tế:

  1. Tính tổng: Theo hàng, cột, toàn bộ
  2. Tìm kiếm: Giá trị max/min và vị trí
  3. Thống kê: Đếm, lọc theo điều kiện
  4. Game: Kiểm tra trạng thái bàn cờ

Lưu ý quan trọng:

  1. Vòng lặp lồng: i cho hàng, j cho cột
  2. Kiểm tra giới hạn: len(list_2d)len(list_2d[i])
  3. Hiệu suất: Tránh lặp không cần thiết
  4. Debug: In ra để kiểm tra kết quả

Chuẩn bị cho bài tiếp theo:

Bài tiếp theo sẽ học về ➕ Phép toán trên ma trận - cộng, nhân ma trận!


💡 Mẹo: Luôn kiểm tra kích thước ma trận trước khi duyệt!

🔄 Thực hành: Thử tạo bảng cửu chương bằng list 2 chiều!

🐍 Khóa học Python căn bản bằng tiếng Việt