Python嵌套列表的应用
较难2玩转Python嵌套列表:从储物柜到座位表
同学们,你们见过俄罗斯套娃吗?一个大娃娃里面还藏着一个小娃娃。在Python中,列表也可以像套娃一样,一个列表里面再放列表,这就叫嵌套列表。它可以帮我们存储有“行”和“列”的数据,比如棋盘、成绩单、座位表,还有你每天要用的课程表。
想象一下,你的书桌上有几个储物柜,每个柜子里面又分了好几层。我们可以用一个嵌套列表来表示:
lockers = [
["铅笔", "橡皮", "尺子"], # 第一个柜子
["本子", "钢笔", "修正带"], # 第二个柜子
["水彩笔", "油画棒", "彩铅"] # 第三个柜子
]
这里,lockers是一个大列表,里面装了三个小列表,每个小列表是三件文具。
一、如何访问嵌套列表里的数据?
要拿到第一个柜子的第二件物品“橡皮”,该怎么办?先进入第一个柜子(索引0),再拿第二层(索引1):
print(lockers[0][1]) # 输出:橡皮
这就像先打开第一个柜子,再从里面拿第二层的物品。第一个方括号选大列表中的小列表,第二个方括号选小列表中的元素。
我们再玩一个例子:假如你的班级座位有3行5列,就像电影院那样。我们可以用嵌套列表来记录每个座位坐的是谁:
seats = [
["小红", "小明", "小刚", "小丽", "小华"], # 第1行
["小美", "小强", "小兰", "小军", "小文"], # 第2行
["小杰", "小芳", "小豪", "小欣", "小宇"] # 第3行
]
现在想知道第2行第4个座位(注意:行列都是从0开始数)坐的是谁?第2行索引是1,第4个座位索引是3,所以:
print(seats[1][3]) # 输出:小军
常见错误:很多新手会把行和列的顺序搞反,写成 seats[3][1],这样会得到“索引越界”的错误,因为行只有3行(索引0,1,2),seats[3]根本不存在。记住:先写行,再写列,就像先找到第几排,再找第几个座位。
二、如何修改嵌套列表里的元素?
假如你把“铅笔”弄丢了,换成了“钢笔”,可以这样操作:
lockers[0][0] = "钢笔"
print(lockers)
# 输出:[['钢笔', '橡皮', '尺子'], ['本子', '钢笔', '修正带'], ['水彩笔', '油画棒', '彩铅']]
再比如,考试后老师要改成绩。假设你的班级成绩单是一个嵌套列表,每行是一个同学的三科成绩(语文、数学、英语):
scores = [
[88, 92, 85], # 小红
[75, 80, 90], # 小明
[95, 97, 93] # 小刚
]
小明的数学考了80分,老师发现他的数学卷子少算了5分,要改成85分:
scores[1][1] = 85 # 第2行(小明)的第2列(数学)改成85
print(scores)
# 输出:[[88, 92, 85], [75, 85, 90], [95, 97, 93]]
常见错误:有人会忘记用等号赋值,以为直接打印就能改,比如 print(scores[1][1] = 85) 会报语法错误。记住:修改是赋值语句,不能和 print 写在一起。
三、用for循环遍历嵌套列表
假设你想查看全班所有同学的所有科目成绩,可以用两个 for 循环:外层循环遍历每一行(每个同学),内层循环遍历该行的每个元素(每科成绩)。
scores = [
[88, 92, 85], # 小红
[75, 80, 90], # 小明
[95, 97, 93] # 小刚
]
for row_index, row in enumerate(scores): # row_index 是行号(从0开始)
print(f"第{row_index+1}个同学的成绩:", end="")
for score in row: # score 是每一科分数
print(score, end=" ") # 在同一行输出
print() # 换行
运行结果:
第1个同学的成绩:88 92 85
第2个同学的成绩:75 85 90
第3个同学的成绩:95 97 93
常见错误:只写一个 for 循环,把嵌套列表当成普通列表遍历,结果得到的是每个小列表(例如 [88,92,85]),而不是单个成绩。记住:处理嵌套数据需要嵌套循环。
四、创建一个嵌套列表——比如你的零花钱记录
假设你每周有5天的零花钱,记录在三个星期里:
# 创建一个嵌套列表:每个星期是一个列表,里面是周一到周五的零花钱(元)
weekly_money = [
[5, 5, 0, 10, 5], # 第一周:周三没给零花钱
[10, 10, 10, 10, 10], # 第二周:每天10元
[5, 5, 5, 5, 5] # 第三周:每天5元
]
# 计算总零花钱
total = 0
for week in weekly_money: # week 是每个星期的列表
for day_money in week: # day_money 是每天的钱
total += day_money
print(f"三周总共零花钱:{total}元") # 输出:三周总共零花钱:75元
常见错误:想直接 sum(weekly_money) 会报错,因为 sum 只能对数字列表求和,而 weekly_money 里面是列表。需要用两个循环或者用 sum(map(sum, weekly_money)) 这类高级写法。
五、完整可运行示例:班级座位表与调换座位
下面是一个完整的程序,先创建座位表,然后交换两个同学的位置,最后打印新座位表:
# 嵌套列表:座位表,3行3列
seats = [
["小明", "小红", "小刚"], # 第1行
["小丽", "小华", "小美"], # 第2行
["小强", "小兰", "小军"] # 第3行
]
print("原来的座位表:")
for row in seats:
print(row)
# 小明(第1行第1列)和小华(第2行第2列)要换座位
# 先用两个变量暂存两个人的名字
temp_ming = seats[0][0] # 小明
temp_hua = seats[1][1] # 小华
# 交换赋值
seats[0][0] = temp_hua # 小明的位置变成小华
seats[1][1] = temp_ming # 小华的位置变成小明
print("\n换座位后的座位表:")
for row in seats:
print(row)
运行结果:
原来的座位表:
['小明', '小红', '小刚']
['小丽', '小华', '小美']
['小强', '小兰', '小军']
换座位后的座位表:
['小华', '小红', '小刚']
['小丽', '小明', '小美']
['小强', '小兰', '小军']
注意:交换时一定要用临时变量保存其中一个值,否则直接赋值会丢失数据。你也可以用 Python 的元组交换:seats[0][0], seats[1][1] = seats[1][1], seats[0][0],但为了容易理解,这里用临时变量。
六、小结与相关指引
嵌套列表就像是列表中的列表,用来表示有行和列的数据结构,比如棋盘、成绩单、座位表、图像像素(每个像素是 RGB 三个值)。记住:要一层一层地找到你要的数据,先打开外面的列表,再打开里面的列表。
如果你掌握了嵌套列表,接下来可以学习:
- 多维数组:Python 的
numpy库让多维数组操作更高效。 - 字典嵌套:字典里也可以放列表或字典,用于表示更复杂的数据(比如学生信息包含姓名、成绩列表)。
- 列表推导式:可以快速生成嵌套列表,例如
[[0 for _ in range(4)] for _ in range(3)]生成一个 3 行 4 列的全零矩阵。
自己动手试试,写一个你喜欢的嵌套列表吧!比如:创建一个“零食价格表”,每个星期几对应一个价格,看看一周的零食总花费是多少。
例题精讲
已知嵌套列表 matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]],则 matrix[1][2] 的值是?
执行以下代码后,a 的值是? x = [[0] * 2 for _ in range(3)] x[1][0] = 5 a = x[1][0]
对于嵌套列表 seat = [["A1", "A2"], ["B1", "B2"]],语句 seat[0][1] = "A3" 会将第一个子列表修改为 ["A1", "A3"]。
以下代码创建了一个3行4列的二维列表(所有元素初始为0),请填空完成。
rows, cols = 3, 4
matrix = [[0 ___ cols ___ _ in range(rows)]以下代码遍历嵌套列表 scores = [[85, 90], [78, 88], [92, 95]],计算所有学生的总成绩并打印。请填空。
total = 0
for row in scores:
___ score in row:
total ___ score
print(total)