CC++ & Algorithm

Python嵌套列表的应用

较难2
语言版本:C++Python
概述:用储物柜和座位表的比喻,教同学们如何在列表中再放列表,并学会访问和修改里面的数据。

玩转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 列的全零矩阵。

自己动手试试,写一个你喜欢的嵌套列表吧!比如:创建一个“零食价格表”,每个星期几对应一个价格,看看一周的零食总花费是多少。

例题精讲

1单选题

已知嵌套列表 matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]],则 matrix[1][2] 的值是?

A2
B5
C6
D8
2单选题

执行以下代码后,a 的值是? x = [[0] * 2 for _ in range(3)] x[1][0] = 5 a = x[1][0]

A0
B5
C报错
D2
3判断题

对于嵌套列表 seat = [["A1", "A2"], ["B1", "B2"]],语句 seat[0][1] = "A3" 会将第一个子列表修改为 ["A1", "A3"]。

4填空题
以下代码创建了一个3行4列的二维列表(所有元素初始为0),请填空完成。

rows, cols = 3, 4
matrix = [[0 ___ cols ___ _ in range(rows)]
5填空题
以下代码遍历嵌套列表 scores = [[85, 90], [78, 88], [92, 95]],计算所有学生的总成绩并打印。请填空。

total = 0
for row in scores:
    ___ score in row:
        total ___ score
print(total)