尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Python列表、元组、集合 实验实训
一、实验目的1. 深入掌握列表、元组、集合底层特性可变不可变、可哈希判定规则区分“引用不可变”和“元素内容不可变”2. 精通切片语法、步长正负、del切片删除的底层执行逻辑理解切片删除时索引的计算陷阱3. 熟练运用集合交、并、差、对称差运算掌握集合推导式、列表推导式4. 能够处理嵌套列表、嵌套元组准确判断嵌套对象是否可哈希5. 理解集合去重丢失顺序问题实现保留原始顺序的去重算法6. 具备代码排错能力独立分析TypeError: unhashable type、切片删除预期不符等疑难问题7. 根据需求自主选择容器完成小型综合数据处理任务。二、实验环境1. Python 3.X及以上2. 开发工具PyCharm或VSCode3. 无第三方库依赖。三、预习任务课前必须完成一回顾基础回顾list有序可变、tuple有序不可变、set无序可变、元素必须可哈希等基本特性。二重点预习难点1. del ls[::-1]、del ls[1::2]、del ls[::3]的区别理解“切片删除是按照原始列表索引一次性计算不是动态实时索引”2. 嵌套容器哈希判定(1,2)可哈希(1,[2,3])不可哈希3. 对称差集^的含义三预习思考题1. 执行ls [1,2,3,4,5,6]; del ls[::2]剩下哪些元素如果一边循环一边删除列表元素会出现什么问题2. t ([1,2],[3,4])能否加入集合为什么3. 集合是可变对象集合本身能否作为另一个集合的元素如果想要嵌套集合怎么办提示frozenset答1.循环删除问题for 遍历依据列表索引迭代删除元素后列表长度改变后续元素向前移位会造成元素跳过漏删无法达到预期删除效果。2.不能加入集合。元组内部存放了列表可变对象导致整个元组不可哈希集合元素要求必须是可哈希对象会触发TypeError: unhashable type: list。3.普通 set 是可变对象不可哈希不能直接作为集合的元素。 需要嵌套集合时使用frozenset冻结集合它是不可变、可哈希类型可以放入集合当中四、实验原理1. 列表list动态数组存储对象引用切片操作生成新序列del 列表[切片]原地批量删除遍历过程中删除元素极易产生漏删2. 元组tuple不可变指元组内部存储的引用地址不可修改不限制引用指向的可变对象内部修改只要元组内任意一个元素是不可哈希对象整个元组不可哈希3. 集合set哈希表实现支持、|、-、^四种运算普通set可变不能嵌套固定不变集合使用frozenset可哈希可以放进集合4. 哈希判定只有生命周期内hash值固定的对象才是可哈希对象5. 去重两种方案list(set(ls))简洁但丢失原有顺序保序去重利用字典key自动去重且有序或循环判断实现。五、实验内容与任务由易到难共5个任务任务5为综合设计必做任务1切片删除深度探究验证分析重点考点要求先手写预判结果再运行代码核对分析为什么和直觉不一样。# 1ls1 [0,1,2,3,4,5,6,7,8,9]del ls1[::3]print(ls1, ls1)# 2ls2 [0,1,2,3,4,5,6,7,8,9]del ls2[1::3]print(ls2, ls2)# 3负步长切片删除ls3 [0,1,2,3,4,5]del ls3[::-2]print(ls3, ls3)#拓展坑不要在for循环里边遍历边删ls4 [1,2,3,4,5,6]for i in ls4:if i % 2 0:ls4.remove(i)print(ls4循环删除偶数结果, ls4)要求写出预判值、实际运行值解释循环删除出错的原因。del ls1[::3]预判[1, 2, 4, 5, 7, 8] 实际[1, 2, 4, 5, 7, 8]del ls2[1::3]预判[0, 2, 3, 5, 6, 8, 9] 实际[0, 2, 3, 5, 6, 8, 9]del ls3[::-2]预判[0, 2, 4] 实际[0, 2, 4]ls4 预判[1, 3, 5] 实际[1, 3, 5, 6]解释循环删除出错的原因for i in ls4是根据列表迭代器按下标顺序遍历当remove()删除一个元素列表长度变短后面元素整体向前移动一位迭代器下标继续 1会跳过下一个元素。任务2嵌套容器与可哈希深度辨析探究题依次取消注释测试记录每一条报错或成功写出理由s set()# s.add( (1,2,3) )# s.add( (1,[2,3]) )# s.add( [1,2] )# s.add( frozenset({1,2}) )# s.add( {1,2} )print(s)1s.add( (1,2,3) ) 成功 集合{(1, 2, 3)}原因分析元组(1,2,3)全部元素都是不可哈希不可变整体元组可哈希可以作为 set 的元素。2s.add( (1,[2,3]) ) 报错TypeError: unhashable type: list 原因分析元组本身引用不可变但内部包含列表[2,3]列表可变、不可哈希只要元组有任意一个元素不可哈希整个元组就不可哈希不能放入集合。3s.add( [1,2] ) 报错TypeError: unhashable type: list原因分析list 是可变容器不可哈希不能作为集合的元素。4s.add( frozenset({1,2}) ) 成功集合{frozenset({1, 2})}原因分析frozenset是不可变固定集合可哈希可以加入普通 set。5s.add( {1,2} ) 报错TypeError: unhashable type: set原因分析普通set是可变对象不可哈希不能作为另一个集合的元素。思考如果我需要“集合里面存放集合”应该用什么类型答普通 set 可变不可哈希不能嵌套需要使用 frozenset冻结集合。frozenset 不可变、可哈希可以作为 set 的元素实现集合嵌套frozenset作用frozenset 为不可变集合主要解决普通 set 不可哈希带来的限制当需要把集合作为另一个集合的元素或者字典的键时使用 frozenset。一旦创建内容不能修改。任务3集合全部运算集合推导式给定两组数据A {2,4,6,8,10,12}B {3,6,9,12,15}。要求代码实现交集、并集、A-B、B-A、对称差集。额外使用集合推导式生成130中所有能被4整除的数字集合。代码任务4去重算法对比保序vs无序去重原始列表data [5,2,7,2,5,9,7,3,9,1]。方案1list(set(data))观察输出顺序方案2自己编写代码保留第一次出现顺序完成去重不允许直接使用第三方库。提示新建空列表遍历原始数据元素不在新列表才append。拓展使用dict.fromkeys(data)一行实现保序去重。对比list(set(data)) 优点代码简短快速完成去重。 缺点集合是无序的会丢失原始元素出现顺序输出顺序不确定。手写循环保序去重 原理新建空列表遍历原列表如果元素不在新列表就追加进去保留元素第一次出现的先后顺序。 优点保留原始顺序容易理解兼容所有 Python 版本。 缺点num not in res2是列表查找数据量大的时候效率偏低。任务5综合设计题必做分值最高需求有两份学生选课编号列表class1 [101,103,105,107,109,103,101]class2 [102,104,106,108,109,107,102]① 分别获取两个班不重复的选课学生编号保序② 求出同时选两门课的学生编号③ 求出只选其中一门课的学生编号对称差④ 求出选了1班但是没有选2班的学生编号⑤ 将最终的交集结果转为元组为什么交集结果可以转元组还可以存入集合输出所有结果并配上文字说明。拓展给定嵌套列表 nest [[1,2],[3,4],[1,2],[5,6]]要求对嵌套列表去重。提示内层list不可哈希需要先转成元组去重之后按需转回列表。必答思考题1. del ls[::3]是按删除前索引计算还是动态实时索引举例说明2. t(1,[2,3])为什么t[1].append(4)合法但是t不能放入集合3. 为什么普通set不能嵌套frozenset可以作为集合元素4. 使用for遍历列表同时remove元素为什么会出现删不干净给出一种安全的修改方案5. list(set(数据))去重的缺陷是什么保序去重有哪些实现方式答1.dells[::3]是按照删除之前原始列表的索引一次性计算所有待删除下标不是删除一个元素就动态更新索引。 举例ls [0,1,2,3,4,5,6,7,8,9] del ls[::3] 原始下标 0、3、6、9 被删除不是删完 0 之后列表变短再重新算下一个下标。如果是动态索引得到的结果会和实际运行结果不一致。2.元组的不可变指存储元素的引用地址不可改变不是元素里面的数据不能修改。t[1]存的是列表的引用这个引用不能替换但是列表本身是可变对象可以调用 append 修改列表内部内容所以t[1].append(4)合法。 集合要求元素必须可哈希元组中包含列表不可哈希对象整个元组就变成不可哈希因此不能加入集合会报TypeError: unhashable type: list。3.普通set是可变对象可以 add、remove 修改内容不可哈希不能作为集合的元素。frozenset是冻结集合创建后内容不能修改属于可哈希对象满足集合对元素的哈希要求因此可以作为另一个集合的元素实现集合嵌套。4.for迭代器依靠下标遍历列表调用remove()删除元素列表长度缩短后面的元素向前移动迭代器下标继续向后增加会跳过部分元素造成漏删。即使个别测试样例碰巧输出正确写法依旧不可靠安全方案二选一 方案 1遍历列表的副本for i in ls.copy():在原列表执行 remove。 方案 2使用列表推导式生成新列表ls [x for x in ls if 条件]5.缺陷集合是无序容器list(set(数据))去重之后丢失原始数据的先后顺序输出顺序不确定。保序去重实现方式手写循环新建空列表遍历原始数据元素不在新列表才 appendlist(dict.fromkeys(数据源))利用字典 key 不可重复并且保存插入顺序的特性实现保序去重实验小结本次实验掌握了列表、元组、集合三种容器的核心特性列表有序可变支持切片原地删除但遍历中直接删除会发生漏删问题元组有序不可变仅引用地址固定内部若包含可变元素则整体不可哈希集合基于哈希表实现元素必须可哈希可快速完成交、并、差、对称差运算但原生无序普通集合不能嵌套需使用frozenset实现嵌套。集合直接去重简单高效但会丢失原始顺序可通过循环判断或dict.fromkeys()实现保序去重。编写代码时需要注意可哈希判定、切片删除按原始索引计算等陷阱根据业务需求合理选择容器类型处理数据。
RELATED

相关推荐

【架构设计】教育类 App 服务端化改造:AI 上移、题库分层与个人题库归属

【架构设计】教育类 App 服务端化改造:AI 上移、题库分层与个人题库归属

一个纯本地的 AI 刷题 App 要上架,最硬的阻塞不是功能,而是「模型密钥打在 APK 里」和「用户换手机题库全丢」。这篇给出完整改造方案:AI 调用上移、公共题库与个人题库的分层存储、同步协议设计,以及一个必须回答的问题——个人题…

📅 2026/11/6 1:58:05
日志脱敏双链路统一优化:从两套枚举到单一规则源,兼顾安全与可维护性

日志脱敏双链路统一优化:从两套枚举到单一规则源,兼顾安全与可维护性

一、背景:为什么要做日志脱敏统一改造在金融、政企类系统中,日志脱敏是数据安全合规的基础要求。业务系统的日志通常包含两类敏感数据载体:Java 实体对象:接口出参、业务DTO等,通常以JSON形式打印到日志接口报文&#…

📅 2026/11/6 1:58:05
MediaTek MT8367 / MT8366(Genio 360 系列)芯片分析报告

MediaTek MT8367 / MT8366(Genio 360 系列)芯片分析报告

6nm先进低功耗制程8 核2A76 6A55(360P)7.4 TOPSNPU 算力(系统 8.5)4K60单屏显示 / 双 FHD60-40~105C工业宽温 供货至 2035一、产品概述MT8366 与 MT8367 是联发科(MediaTek)Genio 360 系列的两款 6nm 价值…

📅 2026/11/6 1:58:05
MORE NEWS

更多资讯

📰

MySQL外键约束报错分析与最佳实践

1. 外键约束报错问题深度解析今天在重构一个学生成绩管理系统时,遇到了一个让我抓狂的外键约束报错。错误提示明确告诉我"Missing unique key for constraint score_ibfk_9 in the referenced table student",但奇怪的是我明明已经移除了所有相…

📰

UNet图像分割项目落地避坑指南:数据预处理、模型调试与部署全流程

简介:本资源是一份面向Python图像处理初学者与深度学习入门者的U-Net图像分割实践项目,聚焦生物医学、遥感及卫星影像等场景下的像素级分割任务。资源提供完整可运行代码框架与配套示例数据,涵盖数据预处理、模型构建(含跳跃连接与…

📰

拓扑排序算法解析:从课程表到循环依赖检测

1. 项目概述:当课程表遇上死循环新学期选课时最怕遇到这种情况:A课程要求先修B课程,B课程又要求先修C课程,而C课程居然要求先修A课程——这就形成了一个无法解开的死结。在计算机科学中,这类问题被称为"循环依赖&…

📰

拓扑排序算法解析与循环依赖检测实战

1. 项目背景:课程表里的死循环陷阱计算机专业的学生小张最近遇到了一个诡异的问题——他开发的选课系统在特定情况下会陷入无限等待。经过排查发现,当课程之间存在"A依赖B,B依赖C,C又依赖A"这种环形依赖关系时&#xff…

📰

NX CAM二次开发:刀具参数批量修改工具实现

1. 项目背景与核心需求在数控加工领域,NX CAM作为行业领先的计算机辅助制造软件,其二次开发能力为工程师提供了强大的定制化工具。刀具参数管理是加工编程中的高频操作场景,传统的手动修改方式在面对大批量刀具调整时效率低下且容易出错。这正…

📰

自托管AI网关OpenClaw架构设计与性能优化实践

1. 项目背景与核心价值去年在帮一家金融科技公司做AI服务架构升级时,他们提出了个棘手需求:既要保证内部数十个AI模型的稳定服务,又要避免将所有请求都路由到公有云API。这让我开始研究自托管AI网关的方案,最终设计出了OpenClaw这…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬