本章摘要核心目标搞懂什么时候用元组、什么时候用列表学会用集合一行代码完成去重与集合运算核心知识点元组tuple只读特性 / 元组解包 / 集合set自动去重 / 交集 并集 | 差集 -实操产出能独立写出班级选修课选课统计器、名单去重工具、共同好友查找器前置基础第 2 章变量类型第 3 章if判断第 4 章for循环遍历写在前面前面几章你一直在用列表装东西看起来列表已经够用了——为啥还要学元组和集合因为列表有两个缺陷恰好是元组和集合擅长补的列表可以随便改——但有些数据你不希望被改比如身份证号、坐标点、星期几的名字改错就出事。这时候用元组Python 会帮你锁死。列表允许重复——但生活里很多场景需要不重复比如报名名单里的学号、CSDN点过赞的用户 ID。手动去重要写好几行代码用集合一行就搞定。这一章你会认识 Python 内置数据结构里的第二梯队元组只读版列表和集合自动去重版列表。它们不是高级用法是日常写代码时能明显省事的工具。学完你会有个很实用的直觉——数据一固定就想到元组数据一去重就想到集合。一、元组tuple不可变的只读列表1.1 创建元组元组用圆括号()装元素元素之间用逗号隔开# 一个坐标点point(10,20)# 一周七天week(周一,周二,周三,周四,周五,周六,周日)# 元组里可以混各种类型student(张三,18,95.5,True)print(point)print(week)print(student)运行输出(10, 20) (周一, 周二, 周三, 周四, 周五, 周六, 周日) (张三, 18, 95.5, True)看着和列表几乎一样唯一区别就是括号从[]变成了()。1.2 元组的读取和列表完全一样用下标取值、切片、len()、for遍历——列表怎么玩元组就怎么玩week(周一,周二,周三,周四,周五,周六,周日)# 下标取值print(week[0])# 周一print(week[-1])# 周日负数下标从右往左# 切片print(week[0:5])# 前五天工作日# 长度print(len(week))# 7# 遍历fordayinweek:print(今天是,day)记住一句话元组的读和列表一模一样差别只在写。1.3 元组不能改——这就是它的价值试着改一下元组Python 会直接报错point(10,20)point[0]99# ❌ 报错TypeError: tuple object does not support item assignment一开始看会觉得——这算什么优点反倒变笨了其实这是故意的保护机制。举个例子# 用元组表示颜色 RGB 值一旦设定就不能被误改red(255,0,0)green(0,255,0)# 如果换成列表谁都能改red_list[255,0,0]red_list[0]0# 红色变黑色了出 bug 都查不到判断标准数据一旦确定、以后不需要修改用元组后续要增删改查用列表。1.4 元组解包一次赋值多个变量这是元组最好用的特性之一——一行代码同时赋值给多个变量point(10,20)x,ypoint# x 10, y 20print(x,y)# 10 20# 交换两个变量的值Python 里的经典写法a1b2a,bb,aprint(a,b)# 2 1其他语言里交换变量要借助中间变量Python 里靠元组解包一行搞定。这个技巧后面写函数返回多个值的时候还会用到第 9 章。二、集合set自动去重的无序容器2.1 创建集合集合用大括号{}装元素——注意这个符号后面第 7 章讲字典时也会用但字典是{key: value}的形式别混淆# 一个班的选修课报名名单math_class{张三,李四,王五,赵六}print(math_class)运行输出顺序可能和你写的不一样这是正常的{李四, 王五, 张三, 赵六}记住集合是无序的你不能像列表那样用set[0]取第一个元素——因为压根没有第一个这个概念。2.2 集合的核心特性自动去重这是集合最爆款的功能——把一堆重复数据丢进去重复的会自动消失# 一堆点过赞的用户 ID可能有重复点赞likes[u01,u02,u01,u03,u02,u04,u01]print(原始数据,likes)print(去重后,set(likes))print(独立点赞人数,len(set(likes)))运行输出原始数据 [u01, u02, u01, u03, u02, u04, u01] 去重后 {u02, u03, u04, u01} 独立点赞人数 4一行set()就完成了列表去重。这在处理用户 ID、订单号、报名名单这类数据时非常常用。2.3 集合的增删集合可以增删这点和元组不一样但不像列表那样用下标操作而是用方法students{张三,李四}# 加一个元素students.add(王五)print(students)# {张三, 李四, 王五}# 加已经存在的元素静默失败——不报错也不重复students.add(张三)print(students)# {张三, 李四, 王五}还是三个# 删除一个元素students.remove(李四)print(students)# {张三, 王五}注意remove删不存在的元素会报错。如果不确定元素是否存在用discard——找不到就静默跳过students.discard(不存在的人)# 不报错2.4 判断元素是否在集合里比列表快得多用in关键字判断math_class{张三,李四,王五,赵六}if张三inmath_class:print(张三报了数学课)if小明notinmath_class:print(小明没报数学课)冷知识判断元素是否存在集合比列表快非常多。列表要一个个比对集合直接算哈希——数据量一大比如上万条性能差好几个数量级。大数据量下的成员判断集合是首选。三、集合运算交集、并集、差集这是集合最灵性的地方——三个符号直接搞定集合运算比你手写for循环快得多。假设有两门选修课math_class{张三,李四,王五,赵六}english_class{李四,王五,小明,小红}3.1 交集两门都报的学生bothmath_classenglish_classprint(两门都报的,both)# {李四, 王五}3.2 并集|至少报了一门的学生any_onemath_class|english_classprint(至少报了一门,any_one)# {张三, 李四, 王五, 赵六, 小明, 小红}3.3 差集-只报数学、没报英语的学生only_mathmath_class-english_classprint(只报数学,only_math)# {张三, 赵六}3.4 三大运算速查表运算符号效果生活类比交集A B两个集合共同的元素两门课都报的学生并集A | B两个集合合起来自动去重至少报一门的学生差集A - BA 有但 B 没有的元素只报了 A 没报 B 的学生三大运算最常用的场景用户去重、共同好友、A/B 名单对比、订单差异比对。以后你写数据分析、后端接口会大量用到。四、元组、列表、集合三兄弟对比新手最容易懵的就是——什么时候用哪个。给你一张表闭着眼选特性列表 list元组 tuple集合 set符号[](){}可否修改✅ 可以❌ 不可以✅ 可以元素可否重复✅ 可以✅ 可以❌ 自动去重元素是否有序✅ 有下标✅ 有下标❌ 无序什么时候用需要增删改查的数据一旦定好不再改的数据需要去重、判断成员、集合运算一句话记忆要改——用列表要锁死——用元组要去重——用集合五、Scratch 对照Scratch 的列表积木本质对应 Python 的list是唯一原生的数据结构——没有元组和集合的概念。如果你想在 Scratch 里模拟去重得手动写遍历原列表判断新列表是否已包含当前元素不包含才加入一段 Scratch 要拖 5、6 个积木Python 一句set(原列表)就搞定。这就是图形化 → 代码跨过来后最直观的效率提升——数据结构越丰富代码越短。六、综合实战班级选修课选课统计器前几章我们做了变量、判断、循环、for遍历。这一章把元组和集合真正用起来——写一个能给老师用的选课统计小工具。6.1 需求拆解需求数学课报名名单、英语课报名名单已知用集合装方便去重和运算班级学生固定 8 人用元组装一旦确定不能改输出报名总人数、两门都报的、只报数学、只报英语、一门都没报6.2 一步一步来第 1 步定义班级学生元组不可修改class_students(张三,李四,王五,赵六,孙七,周八,吴九,郑十)print(全班共,len(class_students),人)第 2 步数学课和英语课报名名单集合自动去重用集合的原因如果有人报名录入了两次集合会自动去重。math_class{张三,李四,王五,赵六,李四}# 李四不小心录了两次english_class{李四,王五,孙七,周八}print(数学课实际报名,len(math_class),人)# 自动去重后是 4print(英语课实际报名,len(english_class),人)# 4第 3 步两门都报的学生交集bothmath_classenglish_classprint(两门都报的,both,共,len(both),人)第 4 步只报数学、只报英语差集only_mathmath_class-english_class only_englishenglish_class-math_classprint(只报数学,only_math)print(只报英语,only_english)第 5 步至少报了一门的学生并集any_classmath_class|english_classprint(至少报了一门,any_class,共,len(any_class),人)第 6 步一门都没报的学生把班级学生转成集合然后差集这一步稍微绕但很关键——元组要参加集合运算得先转成集合all_students_setset(class_students)# 元组转集合no_classall_students_set-any_classprint(一门都没报,no_class,共,len(no_class),人)第 7 步完整运行输出全班共 8 人 数学课实际报名 4 人 英语课实际报名 4 人 两门都报的 {李四, 王五} 共 2 人 只报数学 {张三, 赵六} 只报英语 {孙七, 周八} 至少报了一门 {张三, 李四, 王五, 赵六, 孙七, 周八} 共 6 人 一门都没报 {吴九, 郑十} 共 2 人6.3 这个案例把本章知识都串起来了元组→ 装班级学生一旦定好就不能乱改集合→ 装报名名单自动去重交集→ 两门都报的差集-→ 只报某一门 / 一门都没报的并集|→ 至少报了一门的set()类型转换→ 元组变集合参与运算老师用这段代码能一分钟内理清全班选课情况——这才叫用 Python 解决实际问题。七、常见报错速查表报错信息出错原因解决办法TypeError: tuple object does not support item assignment试图修改元组元素元组不可改改用列表KeyError: xxxset.remove()删不存在的元素用discard替代remove或先if x in set判断TypeError: unhashable type: list集合里放了列表集合元素必须是不可变类型数字、字符串、元组set()变成dict()空集合写成{}会被识别为空字典空集合必须写set()不能写{}set([1,2,3])结果没有顺序集合本来就是无序的需要顺序就转回列表sorted(set)set object is not subscriptable试图用set[0]下标取元素集合无下标要遍历或转成列表新手最大的坑想写空集合写了s {}——这是空字典不是空集合。空集合只能用s set()。八、本章小结 下章预告本章你学会了元组()只读的列表用于锁死不允许修改的数据元组解包x, y point一行同时赋值多个变量含变量交换a, b b, a集合{}无序、自动去重元素判断比列表快集合三大运算交集 /|并集 /-差集一行代码完成 A/B 名单对比空集合必须写set()不能写{}那是空字典列表、元组、集合三选一要改用列表、要锁死用元组、要去重用集合往期回顾《Python 零基础入门从积木到代码》专栏序零基础学 Python 第1章 | 全平台装环境 VS Code 配置 第一个 Hello World零基础学 Python 第2章 | print 输出 变量赋值 input 交互输入零基础学 Python 第3章 | 条件判断if / elif / else零基础学 Python 第 4 章 | for 循环与 range()让程序帮你重复干活零基础学 Python 第 5 章 | while 循环与循环嵌套让程序看着条件自己干活下一章预告到这里为止你能存一串数据列表/元组/集合但没法存**“名字-年龄”、用户名-密码这种带标签**的数据。第 7 章我们进入 Python 最重要的数据结构——字典 dict键值对存储。学完你能写通讯录、菜单栏、用户信息表、多层嵌套配置——几乎所有真实业务数据都是字典。咖啡续上第 7 章见 九、文末资源区资源说明备注本章配套源码chapter6_all.py元组、集合、选修课统计器完整代码关注梅雅达编程笔记评论领资料Python 官方文档 · 元组tupledocs.python.org/zh-cn/3/tutorial/datastructures.html#tuples-and-sequences元组完整语法权威说明Python 官方文档 · 集合setdocs.python.org/zh-cn/3/tutorial/datastructures.html#sets集合运算完整方法列表Python 官方文档 · 集合类型docs.python.org/zh-cn/3/library/stdtypes.html#set-types-set-frozensetset / frozenset 底层原理资源若出现失效以文章最新更新内容为准可通过作者主页公示邮箱反馈。每节课都配套课后练习题与完整源码。代码报错、看不懂知识点可在评论区粘贴问题逐一解答欢迎关注梅雅达编程笔记持续分享Python零基础学习内容本章完 · 感谢阅读