Python set() 函数(保姆级教程)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观
引言:为什么需要学习 Python set() 函数?
在编程世界中,数据的存储与处理是核心任务之一。Python 提供了多种数据结构来满足不同场景的需求,而集合(Set)作为其中的重要成员,凭借其独特的特性,成为解决许多实际问题的高效工具。无论是数据去重、快速查找,还是数学运算,set() 函数都能提供简洁优雅的解决方案。本文将从基础概念到高级技巧,结合生动的比喻和真实案例,帮助读者全面掌握 Python set() 函数的使用方法。
一、集合的基本概念与核心特性
1.1 什么是集合?
集合是一种无序且不重复的元素集合,可以将其想象为一个分类箱:放入箱中的物品(元素)没有固定顺序,且每个物品只能出现一次。例如,当你整理超市购物清单时,不会重复记录同一商品,这就是集合的典型应用场景。
1.2 集合与列表的对比
特性 | 列表(List) | 集合(Set) |
---|---|---|
有序性 | 元素有固定顺序 | 元素无序 |
重复性 | 允许重复元素 | 元素唯一 |
访问方式 | 通过索引访问 | 通过成员检测访问 |
性能 | 适合顺序遍历 | 适合快速成员检测 |
1.3 如何创建集合?
方法 1:使用 set()
函数
my_list = [1, 2, 2, 3, 4]
unique_numbers = set(my_list) # 输出:{1, 2, 3, 4}
chars = set("hello") # 输出:{'h', 'e', 'l', 'o'}
方法 2:集合推导式(Set Comprehension)
even_numbers = {x for x in range(10) if x % 2 == 0}
方法 3:直接使用大括号 {}
(注意与字典的区别)
empty_set = set() # 正确
二、集合的核心操作与方法
2.1 添加与删除元素
添加元素
my_set = {1, 2, 3}
my_set.add(4) # 单个元素添加
my_set.update([5,6]) # 多个元素添加
print(my_set) # 输出:{1, 2, 3, 4, 5, 6}
删除元素
my_set.remove(3) # 删除存在元素
my_set.discard(2) # 安全删除,不存在时不报错
2.2 集合的数学运算
集合操作的本质是数学中的集合论,可以用 Venn 图形象化理解:
示例场景:两个班级的学生名单交集
class_a = {"Alice", "Bob", "Charlie"}
class_b = {"Bob", "David", "Eve"}
common_students = class_a & class_b # 等价于 class_a.intersection(class_b)
print(common_students) # 输出:{'Bob'}
all_students = class_a | class_b # 等价于 class_a.union(class_b)
print(all_students) # 输出:{'Alice', 'Bob', 'Charlie', 'David', 'Eve'}
only_a = class_a - class_b # 等价于 class_a.difference(class_b)
print(only_a) # 输出:{'Alice', 'Charlie'}
2.3 常用方法与运算符对照表
(与前一段空一行)
| 方法/运算符 | 功能描述 | 示例代码 |
|---------------------|-----------------------------------|-----------------------------------|
| len(s)
| 返回集合元素个数 | len({1,2,3})
→ 3 |
| x in s
| 检查元素是否存在 | 3 in {1,2,3}
→ True |
| s.issubset(t)
| 判断 s 是否为 t 的子集 | {1,2}.issubset({1,2,3})
→ True |
| s.union(t)
| 返回并集 | 等价于 s | t
|
| s.intersection(t)
| 返回交集 | 等价于 s & t
|
| s.difference(t)
| 返回差集(在 s 中但不在 t 中) | 等价于 s - t
|
三、集合的实战应用场景
3.1 数据去重:从杂乱数据中提取唯一值
numbers = [1, 2, 2, 3, 4, 4, 5]
unique_numbers = list(set(numbers)) # 转换为列表后输出:[1,2,3,4,5]
3.2 快速查找:判断元素是否存在
allowed_colors = {"red", "green", "blue"}
user_input = input("请输入颜色:").lower()
if user_input in allowed_colors:
print("颜色有效!")
else:
print("无效的颜色,请重新输入。")
3.3 统计词频:分析文本中单词的出现次数
text = "apple banana apple orange banana grape"
words = text.split()
word_counts = {}
for word in words:
if word in word_counts:
word_counts[word] += 1
else:
word_counts[word] = 1
unique_words = set(words)
for word in unique_words:
print(f"{word}: {words.count(word)}")
四、集合与其它数据结构的对比
4.1 与列表(List)的对比
- 优势:集合的成员检测速度远快于列表(时间复杂度 O(1) vs O(n))
- 劣势:无法通过索引访问元素,不适合需要顺序操作的场景
import time
large_list = list(range(1000000))
large_set = set(large_list)
start = time.time()
1000000 in large_list # 列表检测
print(f"列表耗时:{time.time()-start:.6f}秒")
start = time.time()
1000000 in large_set # 集合检测
print(f"集合耗时:{time.time()-start:.6f}秒")
输出结果通常显示集合检测速度更快。
4.2 与字典(Dict)的对比
- 相似点:两者都使用哈希表实现,支持快速查找
- 区别:字典存储键值对,集合仅存储单个元素
五、进阶技巧与最佳实践
5.1 冻结集合(Frozen Set)
当需要创建不可变集合时,可以使用 frozenset()
:
immutable_set = frozenset([1, 2, 3])
5.2 对称差集:找出两个集合的非公共元素
set_a = {1, 2, 3}
set_b = {3, 4, 5}
symmetric_diff = set_a ^ set_b # 等价于 set.symmetric_difference()
print(symmetric_diff) # 输出:{1, 2, 4, 5}
5.3 集合推导式的高级用法
def generate_fib_set(n):
a, b = 0, 1
fib_set = {a}
for _ in range(n-1):
a, b = b, a + b
fib_set.add(a)
return fib_set
print(generate_fib_set(5)) # 输出:{0, 1, 1, 2, 3} → 注意自动去重
结论:掌握集合的三大核心价值
通过本文的学习,我们明确了 Python set() 函数的三大核心价值:
- 数据去重:快速消除冗余数据,提升数据处理效率;
- 高效查询:通过哈希表实现 O(1) 时间复杂度的成员检测;
- 数学运算:直观实现集合的交、并、差等操作,简化逻辑代码。
对于编程初学者,建议从基础语法入手,通过实际案例巩固理解;中级开发者则可以尝试将集合与字典、列表结合,设计更复杂的数据处理流程。记住,掌握一个工具的价值不仅在于“会用”,更在于“善用”。在后续的开发中,不妨多思考:是否可以通过集合简化当前问题?
最后,鼓励读者尝试将本文中的代码示例运行于本地环境,并结合实际项目需求进行实践。只有通过动手操作,才能真正理解集合的魔力。