# GESP等级：三级 | GESP Python 三级考点

"""
第5节：二维列表 —— 实操练习
GESP #38

说明：补全下方代码中的 ______ 空白处。
运行本文件可查看答案对照。
"""

# ============================================================
# 练习1：二维索引填空
# ============================================================
print("=" * 60)
print("【练习1】二维索引填空")
print("=" * 60)

data = [
    ["苹果", "香蕉", "橙子"],
    ["白菜", "萝卜", "西红柿"],
    ["牛奶", "面包", "鸡蛋"]
]

# 题目1：取出 "苹果"  → 第0行第0列
fruit1 = data[______][______]
# 题目2：取出 "西红柿" → 第1行第2列
fruit2 = data[______][______]
# 题目3：取出 "面包"  → 第2行第1列
fruit3 = data[______][______]
# 题目4：取出最后一行最后一列 "鸡蛋"（用负索引）
fruit4 = data[______][______]
# 题目5：取出第0行（整行）
row_fruit = data[______]

# ----- 答案（取消注释运行）-----
print("\n--- 答案 ---")
# print(f"fruit1 = '{fruit1}'  →  期望: 苹果")
# print(f"fruit2 = '{fruit2}'  →  期望: 西红柿")
# print(f"fruit3 = '{fruit3}'  →  期望: 面包")
# print(f"fruit4 = '{fruit4}'  →  期望: 鸡蛋")
# print(f"row_fruit = {row_fruit}  →  期望: ['苹果', '香蕉', '橙子']")


# ============================================================
# 练习2：补全遍历
# ============================================================
print("\n" + "=" * 60)
print("【练习2】补全遍历 —— 打印成绩表")
print("=" * 60)

scores = [
    ["张三", 90, 85, 92],
    ["李四", 78, 88, 80],
    ["王五", 95, 91, 97]
]

print("成绩表：（姓名  语文  数学  英语）")

# 补全下面的双重 for 循环，逐个打印每个元素
# 提示：外层遍历行，内层遍历列
for ______ in ______:          # 外层：遍历每一行
    for ______ in ______:      # 内层：遍历行中的每个元素
        print(______, end="\t")
    ______                     # 每行结束后换行

# ----- 答案（取消注释运行）-----
# print("\n\n--- 答案 ---")
# for row in scores:
#     for item in row:
#         print(item, end="\t")
#     print()


# ============================================================
# 练习3：用二维列表画 3×3 方格阵
# ============================================================
print("\n" + "=" * 60)
print("【练习3】用二维列表 3×3 方格阵 + 边框")
print("=" * 60)

# 第一步：创建一个 3×3 的二维列表，每个格子填数字 1~9

grid_3x3 = [
    [1, 2, 3],
    [4, 5, 6],
    [______, ______, ______]
]

# 第二步：补全 draw_grid 函数，用 "|" 和 "-" 画边框
# 期望输出：
#  +---+---+---+
#  | 1 | 2 | 3 |
#  +---+---+---+
#  | 4 | 5 | 6 |
#  +---+---+---+
#  | 7 | 8 | 9 |
#  +---+---+---+

def draw_grid(grid):
    """打印带边框的方格阵"""
    rows = len(grid)
    cols = len(grid[0])

    # 顶边框
    print("+" + "---+" * cols)

    for i in range(rows):
        # 数据行：补全下面这行代码
        # 提示：用 "|" 拼接每个元素，元素两端各加一个空格
        print("| " + " | ".join(______) + " |")

        # 底边框或行分隔线
        print("+" + "---+" * cols)


# 调用函数
# draw_grid(grid_3x3)   ← 解除注释运行
# 期望：
#  +---+---+---+
#  | 1 | 2 | 3 |
#  +---+---+---+
#  | 4 | 5 | 6 |
#  +---+---+---+
#  | 7 | 8 | 9 |
#  +---+---+---+


# ============================================================
# 练习4（挑战）：计算每行、每列的和（3×3 矩阵）
# ============================================================
print("\n" + "=" * 60)
print("【练习4★挑战】计算 3×3 矩阵的行和与列和")
print("=" * 60)

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

# 补全代码：计算每行的和、每列的和
# 期望输出：
#   第0行和 = 6
#   第1行和 = 15
#   第2行和 = 24
#   第0列和 = 12
#   第1列和 = 15
#   第2列和 = 18

# ---- 计算行和 ----
for i in range(len(mat)):
    row_sum = 0
    for j in range(len(mat[i])):
        ______ += mat[i][j]            # 累加当前行的元素
    print(f"第{i}行和 = {row_sum}")

# ---- 计算列和 ----
for j in range(len(mat[0])):
    col_sum = 0
    for i in range(len(mat)):
        col_sum += ______               # 累加第 j 列的所有行元素
    print(f"第{j}列和 = {col_sum}")


# ============================================================
# 练习5（挑战）：找出二维列表中的最大值
# ============================================================
print("\n" + "=" * 60)
print("【练习5★挑战】找出二维列表中的最大值")
print("=" * 60)

numbers = [
    [23, 56, 12],
    [87, 34, 45],
    [11, 98, 67]
]

# 补全代码，找到 numbers 中的最大值和它的位置
max_val = numbers[0][0]
max_row = 0
max_col = 0

for i in range(len(numbers)):
    for j in range(len(numbers[i])):
        if numbers[i][j] > max_val:
            ______ = numbers[i][j]
            ______ = i
            ______ = j

# ----- 答案（取消注释运行）-----
# print(f"\n--- 答案 ---")
# print(f"最大值 = {max_val}")
# print(f"位置 = ({max_row}, {max_col})")
# print(f"期望: 最大值 = 98, 位置 = (2, 1)")


print("\n" + "=" * 60)
print("全部练习完成！对照答案检查你的填写。")
print("=" * 60)
