news 2026/6/9 14:57:04

【Python新手村】集合(Set):一个强迫症晚期的“去重大师”

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Python新手村】集合(Set):一个强迫症晚期的“去重大师”

Python 集合(Set):一个强迫症晚期的“去重大师”

哈喽,各位 Python 探险家!

前面我们认识了列表(什么都装的收纳箱)和元组(上了锁的保险箱)。 今天,我们要介绍一位性格非常古怪的朋友——集合 (Set)

如果说列表是排得整整齐齐的队伍,那集合就是一个大麻袋。 往里一倒,顺序全乱,而且它有个严重的“洁癖”:绝对容不下重复的东西!

如果你给他一堆“张三、李四、张三”,他会冷酷地把第二个张三踢出去,只留下一个。 这就是集合,一个莫得感情的去重机器

1. 它是何方神圣?(创建集合)

集合和字典(Dictionary)长得很像,都戴着花括号{}。但字典是“键值对”,集合只有“值”。

# 创建一个集合 # Python: "我不喜欢重复,也不喜欢排队" my_set = {1, 2, 3, 3, 3, 4} print(my_set) # 输出: {1, 2, 3, 4} 看到没?多余的 3 全没了!

新手必踩的大坑:空集合陷阱

如果你想创建一个空集合,你可能会下意识地写:

empty_thing = {} # 错!大错特错! print(type(empty_thing)) # 输出: <class 'dict'> 居然是个字典?

为什么?因为 Python 的字典出道比集合早,{}这个符号早就被字典占用了。正确写法:必须使用set()工厂函数。

real_empty_set = set() # 这才是正宗的空集合

2. 它的脾气:无序且任性

在列表里,你可以说“我要第 0 个元素”。 在集合里?没门!

s = {"香蕉", "苹果", "西瓜"} # print(s[0]) # 报错: TypeError: 'set' object is not subscriptable

翻译成人话:集合里的东西是无序的,就像麻袋里的土豆,谁在前谁在后全看天意(其实是看哈希值,后面细说)。既然没有顺序,自然就没有索引。

3. 核心绝技:一键去重

这是集合在面试和实战中出现率 99% 的场景。 比如你有一个列表,里面有很多重复的用户 ID,你想去重,怎么办?

普通青年:写个 for 循环,一个个判断...(太累了)Python 青年:

id_list = [101, 102, 101, 103, 102] # 一行代码搞定去重:列表 -> 集合 -> 列表 unique_ids = list(set(id_list)) print(unique_ids) # [101, 102, 103]

简单、粗暴、有效。

4. 隐藏技能:数学课代表 (集合运算)

还记得小学数学学的交集、并集、差集吗?(如果不记得了,请假装记得)。 Python 的集合天生就是做这个的,语法简洁到让你想哭。

假设你有两波朋友:

  • A波朋友喜欢吃火锅:hotpot_lovers = {"张三", "李四", "王五"}

  • B波朋友喜欢吃烧烤:bbq_lovers = {"李四", "赵六", "钱七"}

场景 1:既吃火锅又吃烧烤的(交集 &)也就是找共同好友。

# 这里的 & 就像两只手握在一起 print(hotpot_lovers & bbq_lovers) # 输出: {'李四'}

场景 2:吃火锅或者吃烧烤的(并集 |)大家聚在一起开大趴体。

# 这里的 | 就像一根棍子把两边连起来 print(hotpot_lovers | bbq_lovers) # 输出: {'张三', '王五', '李四', '赵六', '钱七'} (自动去重了李四)

场景 3:只吃火锅不吃烧烤的(差集 -)要把那些“叛徒”剔除出去。

# 就像数学减法一样自然 print(hotpot_lovers - bbq_lovers) # 输出: {'张三', '王五'} (李四因为吃烧烤被踢除了)

5. 增删改:小心翼翼的操作

  • 加人add()

  • 踢人remove()vsdiscard()

这里有个很有意思的区别:

s = {1, 2, 3} s.remove(4) # 报错!KeyError。remove 脾气暴躁,删不到就炸毛。 s.discard(4) # 没事。discard 很佛系,有就删,没有就算了。

建议:除非你明确知道元素一定存在,否则用discard()更安全,不容易让程序崩掉。

6. 个人理解:为啥集合查东西特别快?

这是进阶干货! 你可能会问:“既然列表能存东西,集合也能存,除了去重,集合还有啥用?”

答案是:速度。

想象一下你去图书馆找书:

  • 列表(List):就像把书乱堆在地上。你要找一本书,得从头一本本翻,运气不好要翻到最后。(时间复杂度 O(n))

  • 集合(Set):就像有索引系统的书架。每本书都有固定的位置(通过哈希算法计算)。你要找一本书,算一下它的哈希值,直接走到那个位置。有就是有,没有就是没有,不用翻别人。(时间复杂度 O(1))

所以,如果你需要频繁判断if x in data,请务必把data转成集合!速度提升不是一点半点。

总结

Python 的集合 (Set) 是一个特立独行的家伙:

  • 样子是花括号{},但空集合要用set()

  • 性格是容不下重复(去重神器)。

  • 特长是数学运算(交、并、差)。

  • 本质是哈希表(查找速度极快)。

下次遇到“去重”或者“找共同好友”的需求,别犹豫,召唤集合吧!

觉得这篇有意思?点个赞是对“强迫症”作者最好的治愈!(。♥‿♥。)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 9:50:10

安克创新的AB面:创始人分红过亿,存货却压垮现金流

"为何渴求港股二次上市&#xff1f;" 作者 | 王冲和 编辑 | 卢旭成 前不久&#xff0c;安克创新正式向港交所递交了主板上市申请&#xff0c;这个“充电宝第一股”再次被世人关注。 早在2020年8月24日&#xff0c;安克创新已经登陆深交所创业板&#xff0c;上市首…

作者头像 李华
网站建设 2026/6/10 0:06:24

农业物联网通信难题如何破解:3步实现Agent间无缝协同

第一章&#xff1a;农业物联网Agent通信的挑战与演进在现代农业物联网&#xff08;IoT&#xff09;系统中&#xff0c;分布式智能设备&#xff08;即Agent&#xff09;之间的高效通信是实现精准农业的核心。随着传感器网络、边缘计算和自动化农机具的广泛应用&#xff0c;农业场…

作者头像 李华
网站建设 2026/6/8 10:50:31

【首发】Agentic RAN:智能体时代的下一代无线接入网

【摘要】智能体时代的无线接入网应该是什么样的&#xff1f;本文首创性地提出一个全新的概念和定义“Agentic RAN”&#xff1a;以智能体实现无线接入网的自感知、自决策、自执行优化&#xff0c;并在基站/汇聚侧提供边缘AI算力与能力编排&#xff0c;构建“云—边—端”一体的…

作者头像 李华
网站建设 2026/6/10 11:28:52

边缘Agent部署必须掌握的7个关键技术点(附最佳实践)

第一章&#xff1a;边缘Agent部署的核心挑战在现代分布式系统架构中&#xff0c;边缘Agent作为连接中心平台与终端设备的桥梁&#xff0c;承担着数据采集、本地决策和指令执行等关键任务。然而&#xff0c;其部署过程面临诸多技术难题&#xff0c;尤其是在资源受限、网络不稳定…

作者头像 李华
网站建设 2026/6/9 2:30:07

小程序毕设选题推荐:基于微信小程序的集换社卡牌的交易系统基于springboot+微信小程序的集换社卡牌的交易系统小程序【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/6/9 22:12:22

【课程设计/毕业设计】基于Android的乡村研学旅行APP系统app小程序基于springboot+Android的研学旅行服务平台APP小程序设计【附源码、数据库、万字文档】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华