CC++ & Algorithm

Python嵌套列表的遍历

中等2
语言版本:C++Python
概述:用教室座位表的比喻,教会小学生如何用for循环遍历嵌套列表中的每个元素。

用两层循环遍历座位表:Python嵌套列表的遍历

嵌套列表就像一个班级的座位表。每个班级有若干排,每排有若干同学。如果用Python表示,就是列表里面套列表——外层列表代表所有排,内层列表代表每一排的同学。

比如,一间教室有3排,每排坐4个同学:

seats = [
    ["小明", "小红", "小刚", "小美"],  # 第一排的同学
    ["小华", "小丽", "小强", "小芳"],  # 第二排的同学
    ["小军", "小智", "小文", "小杰"]   # 第三排的同学
]

seats 这个列表里装了3个小列表,每个小列表又装了4个名字。想找到每个同学,就必须先找到是哪一排(外层),再找到这一排的第几个(内层)。这种“两层结构”的数据,在编程里非常常见:比如课程表(星期×节次)、游戏地图(行×列)、成绩表(学生×科目)等。

下面我们用几个小章节,一步步学会如何遍历这种嵌套列表。

1. 最简单的遍历:一层一层剥开

要打印出所有同学的名字,可以用两层 for 循环:

for row in seats:           # 外层循环:row 是每一排的列表
    for name in row:        # 内层循环:name 是这一排的每个同学
        print(name, end=" ")  # 不换行,打印一个空格隔开
    print()                 # 一排的同学打印完后,换到下一行

运行结果:

小明 小红 小刚 小美 
小华 小丽 小强 小芳 
小军 小智 小文 小杰 

过程解释

  • 第一次外层循环,row = ["小明","小红","小刚","小美"],然后内层循环依次取出 "小明""小红""小刚""小美",打印后内层循环结束,执行 print() 换行。
  • 第二次外层循环,处理第二排……直到所有排处理完。

注意:内层循环的变量名(这里是 name)要和外层循环的变量名(row)不同,否则会互相覆盖导致混乱。

2. 同时知道座位号:用 enumerate

有时候我们想打印“第1排第2个是小明”这样的信息,就需要知道当前是第几排、第几个位置。Python 的内置函数 enumerate 可以同时拿到序号元素

for i, row in enumerate(seats, start=1):   # i 从1开始,表示第1排
    for j, name in enumerate(row, start=1): # j 从1开始,表示第1个座位
        print(f"第{i}排第{j}个是{name}")

输出:

第1排第1个是小明
第1排第2个是小红
第1排第3个是小刚
第1排第4个是小美
第2排第1个是小华
第2排第2个是小丽
第2排第3个是小强
第2排第4个是小芳
第3排第1个是小军
第3排第2个是小智
第3排第3个是小文
第3排第4个是小杰

为什么用 start=1
因为中国人习惯从1开始数排数和座位号,而计算机里的索引默认从0开始。enumerate 可以通过 start 参数指定起始值,让输出更自然。

3. 现实中更复杂的例子:成绩表求和

假设你有3次考试,每次考试有3个科目的成绩,数据存放在嵌套列表里:

scores = [
    [85, 90, 78],  # 第一次考试:语文、数学、英语
    [92, 88, 95],  # 第二次考试
    [80, 82, 84]   # 第三次考试
]

你想知道这学期所有科目的总分,可以用两层循环累加:

total = 0                     # 总成绩初始为0
for exam in scores:            # exam 是每次考试的列表
    for score in exam:         # score 是每科分数
        total += score         # 累加
print(total)                   # 输出 774

同样思路:如果想求每排的平均分,可以在外层循环里再增加一个求和的变量,内层循环结束后计算并打印。

4. 新手容易犯的4个错误

❌ 错误1:记不住是“两层”循环,只写了一层

for row in seats:
    print(row)  # 只打印出每个小列表,不是里面的名字

结果:

['小明', '小红', '小刚', '小美']
['小华', '小丽', '小强', '小芳']
['小军', '小智', '小文', '小杰']

你只拿到了“一排排资料”,没有“一个一个同学”。

❌ 错误2:内外层变量名混用

for row in seats:
    for row in row:  # 内层也用了 row,覆盖了外层 row
        print(row)

运行时会出错,因为内层循环结束后 row 变成了最后一个名字,外层循环无法继续。

正确做法:内层变量名要和外层不同,比如 rowname,或者 examscore

❌ 错误3:忘了换行

for row in seats:
    for name in row:
        print(name)  # 每个名字都新起一行

输出变成一长串名字竖着排,不像座位表。可以用 end=" " 控制分隔符。

❌ 错误4:索引越界(如果手动用下标)

虽然上面的例子都用 for...in 遍历,但有些同学会用 range(len(seats)) 自己控制下标,容易写错边界。比如:

for i in range(len(seats)):
    for j in range(len(seats[i])+1):  # 多了一个,越界!
        print(seats[i][j])

会报 IndexError: list index out of range。建议初学者多用 for...in 遍历,省心又安全。

5. 完整可运行示例:打印个性座位表

下面的代码把上面的所有知识点整合到一起,输出一个带边框的座位表,并统计每排人数:

# 定义座位表,3排4列
seats = [
    ["小明", "小红", "小刚", "小美"],
    ["小华", "小丽", "小强", "小芳"],
    ["小军", "小智", "小文", "小杰"]
]

print("========== 班级座位表 ==========")
for i, row in enumerate(seats, start=1):
    # 用列表推导式先把每个名字格式化,再拼接成一行
    formatted = [f"{j}:{name}" for j, name in enumerate(row, start=1)]
    line = " | ".join(formatted)         # 用竖线分隔座位
    print(f"第{i}排:{line}")
    # 同时打印这一排的人数(内层列表长度)
    print(f"      (本排共{len(row)}人)")
print("=================================")

运行效果:

========== 班级座位表 ==========
第1排:1:小明 | 2:小红 | 3:小刚 | 4:小美
      (本排共4人)
第2排:1:小华 | 2:小丽 | 3:小强 | 4:小芳
      (本排共4人)
第3排:1:小军 | 2:小智 | 3:小文 | 4:小杰
      (本排共4人)
=================================

6. 小结

  • 嵌套列表就是“列表里装列表”,适合表示表格、矩阵、座位表等二维数据。
  • 遍历时用两层 for 循环:外层负责行(排),内层负责列(座位)。
  • enumerate 可以同时拿到序号,注意用 start=1 让序号从1开始更自然。
  • 内层循环变量名不能和外层相同,否则会互相覆盖。

7. 接下来可以学什么?

学会了遍历嵌套列表,你就能处理很多实际问题了:

  • 二维数组:初中数学的矩阵、表格数据都可以这样处理。
  • 列表推导式:用一行代码生成或转换嵌套列表(比如把成绩表里所有分数加5分)。
  • 游戏地图:用二维列表表示地图格子,两层循环绘制地图。
  • 遍历不规则嵌套:如果列表里的元素不全是列表(比如混有数字和字符串),需要先判断类型再用循环。

试试用两层循环创建一张简单的“课程表”:星期一到星期五,每天上午4节课,用嵌套列表存储课程名称,然后打印出来。你会发现,掌握了嵌套列表的遍历,编程的“地图”一下子扩大了许多!

例题精讲

1单选题

给定嵌套列表 classroom = [["小明","小红"],["小刚","小丽"],["小华","小强"]],要依次输出每个学生名字,以下哪个代码是正确的?

Afor row in classroom: print(row)
Bfor row in classroom: for name in row: print(name)
Cfor name in classroom: print(name)
Dfor i in range(len(classroom)): print(classroom[i])
2判断题

对于嵌套列表 matrix = [[1,2],[3,4],[5,6]],以下代码可以正确打印所有数字: matrix = [[1,2],[3,4],[5,6]] for i in range(len(matrix)): for j in range(len(matrix[i])): print(matrix[i][j])

3填空题
已知嵌套列表 scores = [[90,85],[78,92],[88,95]],存储了3个学生各两门课的成绩。以下代码计算所有成绩的总和,请填空。
scores = [[90,85],[78,92],[88,95]]
total = 0
for row in scores:
    for score in ___:
        total += score
print(total)
4填空题
已知座位表 seats = [["A1","A2"],["B1","B2"],["C1","C2"]],要求输出每个座位号,每行输出完换行。请填空。
seats = [["A1","A2"],["B1","B2"],["C1","C2"]]
for seat_row in seats:
    for seat in seat_row:
        print(seat, end=" ")
    ___  # 完成换行
5单选题

对于嵌套列表 grid = [[1,2,3],[4,5,6],[7,8,9]],要访问数字5,以下哪个是正确的?

Agrid[1][1]
Bgrid[2][1]
Cgrid[1][2]
Dgrid[2][2]