文章目录
- 专栏导读
- 第 07 篇 · 集合 set:去重与关系运算
- 本篇目标
- 一、创建集合
- 两大特性
- 二、增删改查
- 三、关系运算(集合的核心价值)
- 判断关系
- 四、实战场景
- 场景 1:列表去重
- 场景 2:找出两份名单的差异
- 场景 3:共同标签 / 兴趣匹配
- 场景 4:高性能查找
- 五、集合推导式
- 六、frozenset:不可变集合
- 常见坑
- 本篇小结
- 练习题
- 总结
专栏导读
🔥🔥本文已收录于《30天学习Python从入门到精通》
🉑🉑本专栏专门
针对于零基础和需要重新复习巩固的同学所准备的一套基础班教学,从0基础到精通Python,轻松掌握Python,欢迎各位同学订阅,专栏订阅地址:点我直达🤞🤞此外如果您已工作,如需利用Python解决办公中常见的问题,欢
迎订阅《Python办公自动化》专栏,订阅地址:点我直达
第 07 篇 · 集合 set:去重与关系运算
作者:小庄学Python | 系列:《Python基础大全》 · 30 篇从零到能写项目
本篇目标
- 理解集合"无序、唯一"的特性
- 掌握交集、并集、差集等关系运算
- 学会用集合高效去重
- 了解 frozenset 的使用场景
一、创建集合
s1={1,2,3}s2=set([1,2,2,3,3])# {1, 2, 3} 自动去重s3=set("hello")# {'h', 'e', 'l', 'o'} 去重字符empty=set()# 空集合⚠️
{}是空字典,不是空集合!空集合只能用set()。
两大特性
- 元素唯一:自动去重
- 无序:没有下标,不能用
s[0]
s={3,1,2}print(s)# {1, 2, 3} 打印顺序不保证s[0]# ❌ TypeError: 'set' object is not subscriptable二、增删改查
s={1,2,3}s.add(4)# 加一个元素s.update([5,6])# 批量加s.remove(1)# 删除,不存在会报错s.discard(100)# 删除,不存在也不报错 ✅ 推荐s.pop()# 随机删一个并返回(因为无序)s.clear()# 清空2ins# True ← 集合的 in 查询是 O(1),比列表快得多len(s)# 长度三、关系运算(集合的核心价值)
a={1,2,3,4}b={3,4,5,6}a&b# {3, 4} 交集:两边都有a|b# {1,2,3,4,5,6} 并集:合起来去重a-b# {1, 2} 差集:a 有 b 没有b-a# {5, 6} 差集:b 有 a 没有a^b# {1, 2, 5, 6} 对称差集:只在一边出现等价的方法写法(更语义化):
a.intersection(b)a.union(b)a.difference(b)a.symmetric_difference(b)判断关系
{1,2}.issubset(a)# True 是子集a.issuperset({1,2})# True 是超集{1,2}.isdisjoint({5,6})# True 没有交集四、实战场景
场景 1:列表去重
lst=[1,2,2,3,3,3,1]unique=list(set(lst))# [1, 2, 3] 但顺序会乱!# 保持原顺序的去重seen=set()result=[]foriteminlst:ifitemnotinseen:seen.add(item)result.append(item)# result = [1, 2, 3] 顺序保持 ✅# Python 3.7+ 一行搞定result=list(dict.fromkeys(lst))场景 2:找出两份名单的差异
yesterday={"张三","李四","王五"}today={"李四","王五","赵六"}print("新来的:",today-yesterday)# {'赵六'}print("离开的:",yesterday-today)# {'张三'}print("一直都在:",today&yesterday)# {'李四', '王五'}场景 3:共同标签 / 兴趣匹配
user_a_tags={"Python","摄影","健身","咖啡"}user_b_tags={"Python","旅游","咖啡","电影"}match=user_a_tags&user_b_tagsprint(f"共同兴趣:{match}")print(f"匹配度:{len(match)/len(user_a_tags|user_b_tags):.0%}")场景 4:高性能查找
# 判断 100 万条数据里有没有某元素big_list=list(range(1_000_000))big_set=set(big_list)# 999999 in big_list → 需要遍历,慢# 999999 in big_set → 哈希查找,瞬间返回数据量大且要频繁
in判断时,先把列表转成集合,性能提升可能是上千倍。
五、集合推导式
{x**2forxinrange(5)}# {0, 1, 4, 9, 16}{c.lower()forcin["A","b","A"]}# {'a', 'b'}{wforwintext.split()iflen(w)>3}# 长度大于3的单词六、frozenset:不可变集合
fs=frozenset([1,2,3])fs.add(4)# ❌ 不可变# 用途:可以作为字典的 key 或放进另一个集合d={frozenset({1,2}):"这一组"}常见坑
| 坑 | 说明 |
|---|---|
{}创建的是空字典 | 空集合用set() |
| 集合无序,不能索引 | 需要顺序请用列表 |
set(lst)去重会打乱顺序 | 保序用dict.fromkeys() |
| 元素必须是可哈希的 | 列表、字典、集合不能作为集合元素 |
pop()删的是随机元素 | 别依赖它删"最后一个" |
# 不可哈希元素会报错{[1,2],[3,4]}# ❌ TypeError: unhashable type: 'list'{(1,2),(3,4)}# ✅ 元组可以本篇小结
- 集合 = 无序 + 唯一,创建空集合用
set() &交、|并、-差、^对称差- 去重最快:
set(lst);保序去重:list(dict.fromkeys(lst)) - 大量
in查询时,集合比列表快得多
练习题
- 有列表
[1,1,2,2,3,4,4,5],用两种方法去重(一种保序、一种不保序)。 - 找出两个字符串中都出现过的字符,如
"hello"和"world"→{'l', 'o'}。 - 随机生成 100 个 1~50 的整数,统计其中有多少个不同的数字。
下一篇:条件判断 if——让程序学会做选择。
总结
希望对初学者有帮助
致力于办公自动化的小小程序员一枚
希望能得到大家的【一个免费关注】!感谢
求个 🤞 关注 🤞
此外还有办公自动化专栏,欢迎大家订阅:Python办公自动化专栏
求个 ❤️ 喜欢 ❤️
此外还有爬虫专栏,欢迎大家订阅:Python爬虫基础专栏
求个 👍 收藏 👍
此外还有Python基础专栏,欢迎大家订阅:Python基础学习专栏