上一期我们吃透了Python列表的排序与反转,掌握了列表顺序整理的核心技巧,相信大家已经能灵活处理单一维度的列表数据了。
但在实际编程实战中,我们遇到的数据往往不是“单一列表”那么简单——比如存放多个班级的学生成绩、多个用户的完整信息、矩阵数据等,这时候就需要用到“列表嵌套”,也就是我们今天要讲的核心内容:列表嵌套与多维列表。
很多新手看到“嵌套”“多维”就会觉得复杂,其实完全不用怕!列表嵌套本质就是“列表里面装列表”,用法和基础列表高度一致,只是多了一层“层级”。今天从基础定义到实战用法,再到避坑指南,一次性讲透,看完直接套用,轻松搞定复杂列表数据!
📌 先明确:什么是列表嵌套与多维列表?
简单来说,列表嵌套就是将一个或多个列表作为元素,放入另一个列表中,形成“列表套列表”的结构;而我们常说的多维列表,就是列表嵌套的延伸——
• 一维列表:最基础的列表,比如 [1, 2, 3](只有一层元素);
• 二维列表:列表里面嵌套列表,比如 [[1,2], [3,4]](两层结构,最常用);
• 三维及以上列表:列表里面嵌套二维列表,比如 [[[1,2], [3,4]], [[5,6], [7,8]]](实战中较少用,了解即可)。
核心逻辑:不管是几维列表,本质都是“容器套容器”,操作时只需记住“分层访问、分层操作”,和基础列表的增删改查完全通用,只是多了一步“定位层级”。
🔍 核心基础:二维列表的定义(必学)
实战中,二维列表是最常用的嵌套形式,比如存放班级成绩、矩阵数据、用户信息组等,定义方式和基础列表类似,只是元素变成了列表。
核心语法:二维列表名 = [[元素1, 元素2...], [元素1, 元素2...], ...]
下面结合3个高频实战案例,快速掌握二维列表的定义,看完就能上手写:
(1)案例1:存放多个班级的学生成绩(最常用)
# 二维列表:3个班级,每个班级5名学生的成绩score_list = [ [85, 92, 78, 95, 88], # 1班成绩(列表作为元素) [76, 89, 91, 83, 79], # 2班成绩 [90, 87, 82, 93, 86] # 3班成绩]print(score_list) # 输出完整二维列表print(type(score_list)) # 输出:<class 'list'>(本质还是列表)print(type(score_list[0])) # 输出:<class 'list'>(里面的元素也是列表)
(2)案例2:存放多个用户的完整信息
# 二维列表:3个用户,每个用户信息(姓名、年龄、爱好)user_list = [ ["小明", 20, ["Python", "打球"]], # 嵌套列表中再嵌套列表(三维嵌套,简易版) ["小红", 18, ["画画", "阅读"]], ["小刚", 22, ["游戏", "编程"]]]print(user_list) # 输出包含嵌套结构的二维列表
(3)案例3:存放矩阵数据(数学/数据分析场景)
# 二维列表:3行3列的矩阵(每行作为一个列表元素)matrix = [ [1, 2, 3], [4, 5, 6], [7, 8, 9]]print(matrix) # 输出:[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
小提醒:定义二维列表时,建议每行一个子列表(换行书写),这样结构更清晰,便于后续查看和修改;子列表的长度可以不一致(比如有的班级4名学生,有的5名),灵活度很高。
🔨 核心用法:二维列表的访问与操作(必掌握)
列表嵌套的核心操作,就是“分层访问、分层操作”——先定位“外层列表的索引”,再定位“内层子列表的索引”,然后就能像操作基础列表一样,进行增删改查。
关键口诀:外层索引定位子列表,内层索引定位子元素(索引依旧从0开始)。
1. 访问元素(最常用,重点掌握)
访问二维列表中的元素,需要用到“双重索引”:列表名[外层索引][内层索引],一步一步定位到目标元素。
# 以上面的成绩列表为例,访问指定元素score_list = [ [85, 92, 78, 95, 88], # 外层索引0(1班) [76, 89, 91, 83, 79], # 外层索引1(2班) [90, 87, 82, 93, 86] # 外层索引2(3班)]# 1. 访问整个子列表(1班的所有成绩)print(score_list[0]) # 输出:[85, 92, 78, 95, 88](外层索引0)# 2. 访问子列表中的单个元素(1班第3名学生的成绩,内层索引2)print(score_list[0][2]) # 输出:78(外层0,内层2)# 3. 访问嵌套更深的元素(用户列表中小明的爱好)user_list = [["小明", 20, ["Python", "打球"]], ["小红", 18, ["画画", "阅读"]]]print(user_list[0][2][0]) # 输出:Python(外层0→内层2→更内层0)
2. 修改元素(直接定位,按需修改)
修改二维列表的元素,同样需要双重索引定位,然后直接赋值修改,和基础列表的修改用法完全一致。
# 修改成绩列表中的元素score_list = [ [85, 92, 78, 95, 88], [76, 89, 91, 83, 79], [90, 87, 82, 93, 86]]# 1. 修改子列表中的单个元素(1班第3名学生成绩,从78改为80)score_list[0][2] = 80print(score_list[0]) # 输出:[85, 92, 80, 95, 88]# 2. 修改整个子列表(替换2班的所有成绩)score_list[1] = [88, 90, 85, 92, 87]print(score_list) # 2班成绩已被替换
3. 添加元素(外层添加/内层添加,按需选择)
添加元素分为两种场景:给外层列表添加子列表(比如新增一个班级)、给内层子列表添加元素(比如给某个班级新增一名学生成绩),都用append()方法(实战最常用)。
# 给二维列表添加元素score_list = [ [85, 92, 80, 95, 88], [88, 90, 85, 92, 87], [90, 87, 82, 93, 86]]# 1. 给外层列表添加子列表(新增4班成绩)score_list.append([79, 83, 86, 91, 84])print(score_list) # 输出:新增了一个子列表(4班)# 2. 给内层子列表添加元素(给3班新增一名学生成绩94)score_list[2].append(94)print(score_list[2]) # 输出:[90, 87, 82, 93, 86, 94](3班多了一个成绩)
4. 删除元素(外层删除/内层删除,用del语句)
删除元素同样分两种场景:删除外层子列表(比如删除某个班级)、删除内层子列表的元素(比如删除某个学生的成绩),用del语句定位删除即可。
# 删除二维列表中的元素score_list = [ [85, 92, 80, 95, 88], [88, 90, 85, 92, 87], [90, 87, 82, 93, 86, 94], [79, 83, 86, 91, 84]]# 1. 删除外层子列表(删除4班成绩,外层索引3)del score_list[3]print(score_list) # 4班成绩已被删除# 2. 删除内层子列表的元素(删除3班最后一名学生的成绩,内层索引5)del score_list[2][5]print(score_list[2]) # 输出:[90, 87, 82, 93, 86](94已被删除)
🔍 进阶用法:二维列表的遍历(实战高频)
遍历二维列表,就是依次取出所有子列表和子元素,最常用的方式是“双重for循环”——外层循环遍历外层列表(子列表),内层循环遍历子列表中的元素,适合批量处理数据(比如计算所有学生的平均分、筛选及格成绩)。
# 遍历二维列表,批量处理成绩score_list = [ [85, 92, 80, 95, 88], [88, 90, 85, 92, 87], [90, 87, 82, 93, 86]]# 方式1:双重for循环,遍历所有元素print("所有学生成绩:")for class_score in score_list: # 外层循环:遍历每个班级(子列表) for score in class_score: # 内层循环:遍历每个班级的成绩(子元素) print(score, end=" ") print() # 每个班级换行# 方式2:遍历并计算每个班级的平均分print("\n每个班级的平均分:")for i in range(len(score_list)): # 用索引遍历外层列表 class_score = score_list[i] average = sum(class_score) / len(class_score) # 计算平均分 print(f"{i+1}班平均分:{average:.1f}") # 保留1位小数输出结果:所有学生成绩:85 92 80 95 88 88 90 85 92 87 90 87 82 93 86 每个班级的平均分:1班平均分:88.02班平均分:88.43班平均分:87.6
❌ 高频避坑指南
避坑1:索引越界报错—— 忘记“双重索引”,直接用单层索引访问子元素(比如score_list[0][5],子列表只有5个元素,索引最大为4,会报错);
避坑2:混淆外层和内层操作—— 想给子列表添加元素,却操作了外层列表(比如想给1班加成绩,却用了score_list.append(99),变成新增一个子列表);
避坑3:遍历时报错—— 直接遍历二维列表,拿到的是子列表而非单个元素(比如for score in score_list,score是整个班级的成绩列表,不是单个分数);
避坑4:修改子列表时误改所有子列表—— 用乘法创建二维列表(比如list = [[0]*3]*3),修改一个子列表,所有子列表都会被修改(后续会讲正确创建方式);
避坑5:三维列表操作复杂—— 实战中尽量避免使用三维及以上列表,如需处理复杂数据,可后续学习字典嵌套,更简洁易懂。
💡 进阶技巧:二维列表的正确创建与简化写法
新手常踩的“乘法创建二维列表”坑,这里专门讲解正确创建方式,同时分享2种简化写法,提升代码效率。
1. 错误创建方式(避坑)
# 错误方式:用乘法创建二维列表wrong_list = [[0]*3]*3 # 看似创建了3行3列的列表wrong_list[0][0] = 1 # 修改第一个子列表的第一个元素print(wrong_list) # 输出:[[1, 0, 0], [1, 0, 0], [1, 0, 0]](所有子列表都被修改)# 原因:乘法只是复制了子列表的引用,不是创建新的子列表
2. 正确创建方式(推荐)
# 方式1:手动换行创建(最清晰,推荐)right_list1 = [ [0, 0, 0], [0, 0, 0], [0, 0, 0]]# 方式2:用列表推导式创建(简洁高效,实战常用)right_list2 = [[0 for _ inrange(3)] for _ inrange(3)]right_list2[0][0] = 1print(right_list2) # 输出:[[1, 0, 0], [0, 0, 0], [0, 0, 0]](仅修改指定子列表)
3. 简化写法:列表推导式处理二维列表
结合列表推导式,可快速筛选、处理二维列表数据,一行代码搞定批量操作,比双重for循环更简洁。
# 示例1:筛选所有及格成绩(≥60),组成新的二维列表score_list = [ [85, 59, 80, 95, 58], [88, 90, 55, 92, 87], [90, 45, 82, 93, 86]]# 列表推导式:外层遍历子列表,内层筛选及格成绩pass_score = [[s for s in class_score if s >= 60] for class_score in score_list]print(pass_score) # 输出:[[85, 80, 95], [88, 90, 92, 87], [90, 82, 93, 86]]# 示例2:将所有成绩加5分(批量修改)add_score = [[s+5 for s in class_score] for class_score in score_list]print(add_score) # 输出:所有成绩都增加5分
📝 核心总结
列表嵌套:列表里面装列表,核心是“分层结构”,最常用的是二维列表;
核心操作:访问、修改、添加、删除,都需要“双重索引”,外层定位子列表,内层定位子元素;
遍历方法:双重for循环(外层遍历子列表,内层遍历子元素),适合批量处理数据;
避坑重点:避免索引越界、混淆内外层操作、用乘法创建二维列表;
实战技巧:用列表推导式创建、处理二维列表,简洁高效,提升代码可读性。
列表嵌套是Python列表的“进阶延伸”,也是后续学习字典嵌套、数据分析的基础,在实际工作中应用广泛——比如整理多组数据、处理表格数据、实现简单的矩阵运算等。
后续我们会继续讲解列表的高级用法,以及列表与其他数据类型的配合使用,关注我,每天学一点Python干货,从新手逐步成长为编程达人!
代码无需亲手编,逻辑看懂是关键;嵌套列表不难练,分层操作记心间。