集合交并差入门:Python set去重与交集并集差集实验指南

发布时间:2026/10/31 18:29:39

集合交并差入门:Python set去重与交集并集差集实验指南 简介面向数据结构与算法课程初学者及需要完成集合运算实验的读者这份压缩包围绕交集、并集、差集三种基本操作提供可在Visual Studio环境下参考的C实现材料适合软件工程等相关课程的实验教学、课后练习与算法基础巩固。包内共8个文件以3个cpp源文件和3个头文件为主体辅以1份pptx演示文稿和1份docx实验文档压缩包约8.74MB兼顾代码组织、概念讲解、实验记录与结果呈现。已有314人学习说明其作为入门实验案例具有一定参考价值。读者可从中获取集合运算的工程结构、接口划分与结果验证思路并结合演示文稿和实验文档理解操作流程、伪代码表达以及基于数组、链表或哈希表等思路的时间与空间复杂度对比帮助查漏补缺为后续更复杂的算法设计打下基础。1. 先搞懂这份实验一在练什么集合交并差到底是什么第一次打开实验任务看到集合交并差这几个字很多人的第一反应是——这不就是数学课上画的那两个圈吗没错就是它。集合就是一堆不重复的东西凑在一起比如你手机通讯录里的人名交集是两个集合里都有的部分并集是合在一起去掉重复后的全部差集是我有你没有。这份实验一集合交并差的资源练的就是把这三件事用代码写出来输入两组数据输出它们的交、并、差。它适合刚学编程、刚接触数据结构或离散数学、想用一个能跑通的小任务把语法和思路串起来的新手不需要你先懂什么高深算法会打开编辑器就能开始。2. 为什么零基础也该先学集合去重、查重、比对全靠它2.1 从日常场景看集合就是不重复的一袋东西先别急着写代码先想想生活里哪些地方在跟集合打交道。你把两份活动报名表合成一份总名单同名的人只留一个这就是并集加去重你想知道哪几个人两场活动都参加了这就是交集你想知道第一场来了但第二场没来的是谁这就是差集。再往大一点说两家门店的会员名单比对、两个版本的配置文件找差异、爬下来的几千条商品标题去重本质上都是同一件事。很多人以为集合是数学课本里的抽象概念实际上它是编程里最接地气的结构之一。你写一个抽奖程序要保证同一个人不会中两次奖那中奖名单就得是个集合你写一个课程管理系统要判断某个学生是否同时选了两门课那也是在求交集。之所以值得在入门阶段就练它是因为它同时训练了三件新手最缺的东西把现实问题翻译成数据结构的能力、对顺序和重复这两个属性的敏感度、以及用少量代码验证想法的习惯。集合的英文是 set你在搜索框里打set 入门集合 交并差 新手能翻出一大堆内容但大部分一上来就甩 API 文档。作为零基础的人你要抓的不是背下所有方法而是先建立一个直觉集合里的元素是唯一的、无序的、可以判断在不在里面的。这三条抓住后面所有操作都是自然延伸。2.2 交集、并集、差集的人话版定义用两个具体的袋子来讲。假设 A 袋装着苹果、香蕉、橙子B 袋装着香蕉、橙子、葡萄。交集就是两个袋子都有的东西香蕉和橙子。判断标准很简单——这个东西在 A 里有同时在 B 里也有。写代码时你的大脑里应该浮现一句话遍历 A凡是 B 里也有的就留下。并集就是把两个袋子倒在一起同一样东西只算一次苹果、香蕉、橙子、葡萄。注意这里的关键动作是去重如果只是简单地把两个列表拼起来香蕉和橙子会出现两次那不叫并集。差集是在 A 里但不在 B 里只剩苹果。这里有个新手最容易忽略的点——差集是有方向的。A 减 B 得到苹果B 减 A 得到葡萄两个结果完全不同。所以看到题目里写差集两个字你要先确认一句是谁减谁。还有一种叫对称差集意思是只在一个集合里出现过的东西也就是并集减去交集结果是苹果和葡萄。有些实验任务会把它作为加分项你先知道有这么个东西就行不用一上来就啃。把这三种运算和数学里的符号对一下交集是 ∩并集是 ∪差集是 \ 或 −。你在纸上画两个相交的圆中间那块是交集两个圆覆盖的全部是并集左边圆里挖掉中间那块就是 A 减 B。这个图值得你在草稿纸上亲手画一遍比看十篇文章都管用。2.3 用 Python 的 set 先摸一遍手感零基础入门我建议先用 Python 跑通原因是它内置了集合类型交并差一行就能出结果你能把注意力放在逻辑对不对上而不是语法怎么写。装好 Python 之后随便开一个文件或者交互式环境把下面这段敲进去。# 两组原始数据故意各留了一个重复项 group_a [苹果, 香蕉, 橙子, 苹果] group_b [香蕉, 橙子, 葡萄, 葡萄] # set() 会把列表转成集合重复项自动只留一个 set_a set(group_a) set_b set(group_b) print(A 集合, set_a) print(B 集合, set_b) print(交集, set_a set_b) # 两个都有香蕉、橙子 print(并集, set_a | set_b) # 合起来去重苹果、香蕉、橙子、葡萄 print(差集 A-B, set_a - set_b) # 只在 A 里苹果 print(差集 B-A, set_b - set_a) # 只在 B 里葡萄这段代码里有四个符号要认是交集|是并集-是差集set()是转换。set_a - set_b和set_b - set_a我特意都打印了一遍就是想让你亲眼看到方向不同结果不同——这个细节在后面自己手写实现时会让不少人栽跟头。跑完之后你大概率会发现一个玄学现象输出的顺序跟你输入的顺序对不上。这不是你写错了而是集合本身不保证顺序。Python 里集合的底层是哈希表元素按哈希值摆放谁先谁后没有承诺。所以你看到{橙子, 香蕉, 苹果}这种顺序别慌内容对就行。如果实验要求按固定顺序输出后面第 5 章会讲怎么处理。再补一个新手常问的点空集合怎么写答案是set()不是{}。{}在 Python 里是空字典这是个经典陷阱记住就行。3. 第一个能跑的例子10 行代码跑通交并差3.1 环境准备装好 Python 就够了这一步真的没什么门槛但新手容易在这里卡很久所以说细一点。你需要的是一个能运行 Python 的环境去官网下载安装包安装时勾选Add Python to PATH这个选项Windows 上尤其别漏装完打开命令行输入python --version能打印出版本号就说明通了。如果你不想装也可以用任何在线的 Python 运行环境把代码粘进去点运行效果一样。编辑器方面装个轻量的就行别一上来折腾复杂配置。新建一个文件命名成set_demo.py注意后缀是.py这样编辑器才会按 Python 语法给你高亮。运行方式有两种命令行里python set_demo.py或者在编辑器里点运行按钮。第一次跑通之前不要改代码先让原样的例子出结果再谈改动。有个小建议把你跑出来的结果截图或者复制到一个笔记文件里标注上日期。后面你自己改代码改出问题时回头对比这份能跑的版本能省掉大量排查时间这是血泪经验。3.2 把第一个例子敲出来读入、计算、输出下面这个版本比第 2 章更接近一次完整的实验它从用户那里读入两组数据做交并差最后按格式打印。你可以直接照着敲敲完先跑一遍。# 第一步读入两组数据用英文逗号分隔 line_a input(请输入集合 A 的元素用逗号分隔) line_b input(请输入集合 B 的元素用逗号分隔) # 第二步切分成列表并去掉每项前后的空格 list_a [x.strip() for x in line_a.split(,)] list_b [x.strip() for x in line_b.split(,)] # 第三步转成集合重复项自动被去掉 set_a set(list_a) set_b set(list_b) # 第四步计算三种结果 inter set_a set_b # 交集 union set_a | set_b # 并集 diff_ab set_a - set_b # A 减 B # 第五步排序后输出保证每次运行顺序一致 print(交集, sorted(inter)) print(并集, sorted(union)) print(差集 A-B, sorted(diff_ab))逐段解释一下。input()负责从键盘读一行文字读进来的永远是一整串字符串所以要用split(,)按逗号切开——如果你输入苹果,香蕉,橙子切完就变成三个元素的列表。x.strip()是去掉每一项前后的空格因为人手输入的时候很容易写成苹果, 香蕉那个空格要是不去掉香蕉和香蕉在程序眼里就是两个不同的东西这是新手翻车率极高的一处。set()转换那一步做了两件事去重和建立能不能快速判断在不在里面的能力。最后的sorted()是给结果排序纯粹为了让输出好看且稳定。注意sorted()返回的是列表不是集合所以打印出来是[橙子, 苹果]这种带方括号和引号的样子这是正常的。3.3 结果怎么读对着输出逐行核对假设你输入 A 为苹果,香蕉,橙子,苹果B 为香蕉,橙子,葡萄屏幕上应该出现三行交集是香蕉和橙子并集是苹果、香蕉、橙子、葡萄差集是苹果。核对的时候有一个笨办法但特别有效拿张纸先把两组数据画成两个圈手算出结果再跟程序输出对照。哪一行对不上问题就锁定在那一种运算上不用全部重看。比如交集错了但并集对了那多半是和|写反了或者去重环节出了问题。还要注意一种情况如果你输入的数据里含有中文排序结果可能看起来没规律因为中文是按编码顺序排的不是按拼音。这不影响正确性只要内容一致就算对。如果实验要求按输入顺序输出而不是排序那就不能直接用sorted()得改成按原始列表遍历筛选具体做法在第 4 章手写实现那部分会讲到。3.4 改一改参数让它真的像一次实验能跑通只是起点。真正让你学会的是主动去改动它。这里给几个可以马上试的改动方向。第一把分隔符从逗号换成空格也就是split()不传参数它会自动按任意空白切分试试看输入苹果 香蕉 橙子还能不能正常工作。第二把数据从文字换成数字比如输入1,2,3,3和2,3,4看看结果对不对。数字和字符串在集合里的行为是一样的但排序结果的展示会让你更直观。第三故意输入空的或者只有一个元素的集合比如 A 直接回车看看程序会不会崩。这一步是在提前发现边界问题很多人交作业被扣分就是因为没考虑空输入。第四把set_a - set_b改成set_b - set_a确认你真的理解了方向。这四个改动花不了十分钟但对方的掌握程度提升非常明显。4. 从能跑到能交把实验一做出作业的样子4.1 不用 set自己用循环写一遍交并差如果你只是调用现成的集合类型那练到的是会用工具不是会实现。很多实验任务会明确要求你不许用内置集合运算这时候就得自己动手。下面这版用最朴素的循环加判断实现三种运算逻辑一目了然。def my_intersection(a, b): 交集遍历 a凡是 b 里也有的就留下同时避免重复 result [] for x in a: if x in b and x not in result: result.append(x) return result def my_union(a, b): 并集把两组拼起来逐个检查没见过的才加进去 result [] for x in a b: if x not in result: result.append(x) return result def my_difference(a, b): 差集在 a 里但不在 b 里 result [] for x in a: if x not in b and x not in result: result.append(x) return result # 测试一组数据 a [苹果, 香蕉, 橙子, 苹果] b [香蕉, 橙子, 葡萄] print(my_intersection(a, b)) # [香蕉, 橙子] print(my_union(a, b)) # [苹果, 香蕉, 橙子, 葡萄] print(my_difference(a, b)) # [苹果]三个函数的骨架几乎一样都是准备一个空结果列表遍历判断满足条件就放进去。差别只在判断条件交集要求在 b 里差集要求不在 b 里并集则要把两边都走一遍。x not in result这个判断是手动去重的关键少了它输入里的重复项就会原样带进结果。这版实现的输出顺序是稳定的跟着输入走这正好解决了前面说的顺序问题。代价是效率——x not in result需要把结果列表从头到尾看一遍数据量一大就明显变慢。这也自然引出下一个话题。4.2 输入输出格式别在第一个字符就翻车新手交实验最冤枉的失分点往往不是算法写错而是格式对不上。实验说明里写输出用逗号分隔你打印了一个带方括号的列表机器判题就直接判错。处理这类问题有个通用套路先在脑子里把内部表示和输出表示分开。程序内部用列表或集合存数据都没问题输出前统一转成要求的样子。比如要求逗号分隔就写,.join(sorted(result))要求每个元素一行就用循环打印。这一步单独抽出来做不要混在计算逻辑里改起来才方便。输入那边同理。要确认三件事分隔符是什么、有没有多余空格、空输入怎么算。很多题目给的样例输入是1 2 3这种空格分隔的你却按逗号切那就切出来一整串。稳妥的写法是先strip()再按题目指定的分隔符切切完再对每项strip()一次。4.3 复杂度直觉为什么数据一大就卡住这里不讲严谨推导只给你一个能用的直觉。用内置set做交并差判断某个元素在不在集合里几乎是瞬间完成的整体耗时随数据量线性增长一万条和十万条都能秒出。而自己写的那版用列表存结果每次判断都要扫一遍列表数据量翻十倍耗时大概翻一百倍。这个差别在小数据上完全看不出来你输入十个元素两种写法都是眨眼间出结果。但如果实验里有一组几万条的测试数据手写版可能跑好几秒甚至更久判题系统超时就判你错而你对着代码怎么看都觉得逻辑没问题——这种时候要怀疑的就是效率不是对错。提示如果你发现程序结果正确但运行很慢先把判断是否在集合里的那部分换成set通常立刻见效而不需要重写整个逻辑。顺带说一句这个用空间换时间的思路在后面学数据结构时会反复出现实验一其实是个很好的引子。你现在只需要记住查找这件事用集合比用列表快得多原因是集合内部建了索引不用一个个比。4.4 自己造几组测试数据来验证不要只拿题目给的样例测一遍就交。样例过了只能说明你没写错方向不能说明代码稳。建议自己准备四类数据正常的两组、有大量重复的两组、其中一组为空的、两组完全不重叠的。每类数据你先手算出预期结果写在纸上再跑程序对照。这个动作看起来笨但它能提前抓出八成边界问题。我见过太多人样例全过、一交就挂最后发现是空输入时程序直接抛异常。5. 新手最容易翻车的五个地方交并差排查清单5.1 坑一输出的顺序每次都不一样现象逻辑明明没错但每次运行的输出顺序都在变跟标准答案对不上。 原因集合本身不保证顺序set内部按哈希值存放元素遍历顺序跟输入顺序无关。 解决在输出前统一排序比如sorted(result)如果题目要求保持输入顺序就不要用集合直接输出改成遍历原始列表、用集合只做在不在的判断。5.2 坑二重复元素没被去掉现象并集里同一个元素出现了两次或者交集结果里有重复项。 原因只做了列表拼接没有做去重手写实现时漏掉了x not in result这个判断。 解决要么转成set让语言帮你处理要么在每次往结果里加元素前先检查一遍。检查这一步不能省它才是去重的真正动作。5.3 坑三差集方向搞反了现象结果跟预期完全对不上但仔细看又像是另一边的答案。 原因A - B和B - A结果不同写代码时没有确认题目要的是哪一个。 解决读题时把谁减谁用笔标出来变量名也起得明确一点比如only_in_a别用diff这种含糊的名字。写完拿一组两边元素数量不等的测试数据验证一下方向错了立刻能看出来。5.4 坑四输入切分没处理好整串被当成一个元素现象输入了好几个元素结果集合里只有一个元素或者是把每个字都拆开了。 原因split()用的分隔符跟实际输入不一致或者对着字符串直接转集合字符串会被按字符拆开。 解决先确认输入用什么分隔再决定split(,)还是split()切完对每一项做一次strip()去空格。如果输入是1,2,3但你想要数字还得多一步类型转换否则集合里存的是字符串。5.5 坑五空集合写成了花括号现象明明想表示空集合判断结果却不对或者类型检查报错。 原因{}在 Python 里是空字典不是空集合两者类型不同行为也不同。 解决空集合一律写set()。这个坑很小但很典型记住这一条就行。另外判断一个集合是否为空直接if not s:比if len(s) 0:更顺手。6. 做完实验一之后下一步往哪儿走实验一这种小任务最大的价值不是那几行代码而是它给你搭了一个可以往上加东西的骨架。做完之后有三条路可以接着走按照从近到远的顺序推荐给你。第一条把输入输出做得更像样。现在你的程序只能靠键盘输入试试从文件读数据、把结果写回文件这一步会逼你处理编码、路径、异常这些真实场景里绕不开的东西。第二条把三种运算扩展到多组集合上比如一次给五个集合求全部的交集。这本质上是在练循环套循环的思维。第三条去接触一下数据库里的同类操作SQL 里有UNION、INTERSECT、EXCEPT三个关键字做的是同一件事只是数据从内存里的列表变成了表里的行。下面这张表可以帮你把两边对应起来。运算Python 集合写法SQL 关键字一句话解释交集a bINTERSECT两边都有的行并集abUNION差集a - bEXCEPT只在左边出现的行去重set(a)DISTINCT重复的只留一份看清楚这张表你会发现后面学数据库、学数据处理时遇到的很多概念根子都在这里。实验一之所以排在第一个不是因为它简单而是因为它把集合这个最基础的工具先塞到你手里。我自己的教训是第一次做这类实验时我跑通样例就直接交了结果被判题系统那几组边界数据打得措手不及。从那以后我每次写完都会强制走一遍手算预期 造边界数据 对照验证的流程多花十分钟省下重做的两小时。你手上这份实验一集合交并差的资源拿下去别急着只看代码先按第 3 章把第一个例子亲手跑通再去动第 4 章的手写实现最后拿第 5 章的清单把自己的代码过一遍。希望帮到你。本文还有配套的精品资源点击获取
延伸阅读

更多相关文章

2026/10/31 18:29:39

欧陆词典词库安装与调优:MDX/MDD、分组和索引配置

折腾词典这件事,我前后换过三台电脑、两部手机,词库文件夹删了建、建了删,最后稳定下来的一套配置用了两年多没动过。这篇就把“为欧陆词典安装词典库”这件事从头到尾讲透——不是那种“点这里、点那里”的流水账,而是把格式原理…

2026/10/31 18:29:39

差分数组全解析:从一维区间修改到二维与树上差分

1. 区间加法的暴力困境:差分到底解决了什么问题1.1 一道看着不需要任何技巧的题前段时间有个同学拿着一道题来问:数组长度一千万,接下来一千万次操作,每次给一个区间[l, r]里的所有数加上同一个值v,最后把整个数组输出…

2026/10/31 18:29:39

浙政钉H5二次回退问题解析与解决方案

1. 问题背景:浙政钉H5二次回退现象解析 在浙政钉(浙里办小程序)的H5应用开发中,"二次回退"问题是一个典型的导航栈管理异常场景。具体表现为:用户从H5页面跳转到小程序原生页面后,点击返回按钮时…

2026/10/31 20:54:50

ponytail 插件与 skill 机制详解:轻量编排与扩展实践

1. 从“ponytail”这个标题说起:它到底是什么第一次看到“ponytail”这个词,很多人脑子里蹦出来的画面是扎起来的马尾辫。但在技术圈和工具链语境里,它早就不是一个发型词汇了。我最早接触这个词是在一个前端工程化的讨论群里,有人…

2026/10/31 20:54:50

Hyperframes实战:帧批处理、帧间复用与三维张量优化指南

1. 从“hyperframes”这个词说起:它到底指什么第一次看到“hyperframes”这个词,我下意识地把它拆成了“hyper”和“frames”两部分。直觉告诉我,这大概率跟“帧”有关,而且带“hyper”前缀,通常意味着某种超集、超速或…

2026/10/31 20:54:50

上下文管理与用户互动:提升产品体验的核心策略

1. 项目背景与核心观点解析"成功依赖于上下文管理和真实用户互动,而非功能比较"这一观点直指当下产品设计与运营的核心误区。在互联网行业摸爬滚打多年后,我深刻体会到:用户最终为之买单的从来不是技术参数表上冷冰冰的功能对比&am…

2026/10/31 20:54:50

I2C总线从开漏上拉到多主机仲裁与总线恢复

简介:《I2C总线协议详解(中文)》是一份面向嵌入式开发初学者、硬件工程师及电子类专业学生的PDF技术文档,围绕I2C双向二线制串行总线的通信原理与规范展开,可用于入门学习、协议查阅和接口调试参考。全文从版本演进切入…

2026/10/31 20:54:50

STM32软PLC实现:FX3U V8.8源码架构与避坑

简介:FX3U V8.8源码升级包面向工控开发、嵌入式学习与三菱PLC仿真研究人群,围绕FX3U逻辑控制与STM32底层交互提供可参考的源码与工程资料,适合已有一定C语言和嵌入式基础、希望理解仿三菱PLC实现思路的读者。压缩包共713个文件、约78.89MB&am…

2026/10/31 20:49:50

n2n点对点二层组网:源码架构、抓包链路与MTU调优实战

为了让几台分散在不同网段的机器表现得像插在同一台交换机上,我前前后后试过不少路子:写应用层转发中间件、改路由表做三层打通、临时加一台物理交换机把线拉到一起。这些方案各有各的麻烦,其中应用层转发搞不定广播包,路由方案又…

2026/10/30 20:55:10

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/30 20:55:10

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/30 20:55:09

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/31 0:02:41

猫狗目标检测数据集:VOC/COCO/YOLO三格式一体化实战包

简介:本资源是一套面向计算机视觉初学者与YOLO目标检测实践者的猫狗图像数据集及配套开发工具包,专为快速上手目标检测模型训练而设计。资源包含1000张真实场景高清猫狗图片,标注质量高,同时提供VOC(XML)、…

2026/10/31 0:02:41

HDU2017多校标程复现:算法竞赛工程化真题沙盒

简介:本资源为2017年HDU多校联合训练第一场官方配套资料,面向ACM程序设计竞赛备赛学生、算法爱好者及高校编程集训队成员,旨在提供权威解题参考与完整测试验证环境。压缩包共40个文件,含15份C标程(覆盖全部赛题&#x…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑