🔄 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áp | Cú pháp | Khi nào dùng |
|---|---|---|
| Duyệt hàng | for hang in list: | Xử lý từng hàng |
| Duyệt index | for i in range(len): | Cần biết vị trí |
| Duyệt lồng | for 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ế:
- Tính tổng: Theo hàng, cột, toàn bộ
- Tìm kiếm: Giá trị max/min và vị trí
- Thống kê: Đếm, lọc theo điều kiện
- Game: Kiểm tra trạng thái bàn cờ
Lưu ý quan trọng:
- Vòng lặp lồng: i cho hàng, j cho cột
- Kiểm tra giới hạn:
len(list_2d)vàlen(list_2d[i]) - Hiệu suất: Tránh lặp không cần thiết
- 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!