Python嵌套列表的遍历
中等2用两层循环遍历座位表: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 变成了最后一个名字,外层循环无法继续。
正确做法:内层变量名要和外层不同,比如 row 和 name,或者 exam 和 score。
❌ 错误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节课,用嵌套列表存储课程名称,然后打印出来。你会发现,掌握了嵌套列表的遍历,编程的“地图”一下子扩大了许多!
例题精讲
给定嵌套列表 classroom = [["小明","小红"],["小刚","小丽"],["小华","小强"]],要依次输出每个学生名字,以下哪个代码是正确的?
对于嵌套列表 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])
已知嵌套列表 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)已知座位表 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=" ")
___ # 完成换行对于嵌套列表 grid = [[1,2,3],[4,5,6],[7,8,9]],要访问数字5,以下哪个是正确的?