ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Python基础:第 07 篇 · 集合 set:去重与关系运算

Python基础:第 07 篇 · 集合 set:去重与关系运算

文章目录

  • 专栏导读
  • 第 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()。

两大特性

  1. 元素唯一:自动去重
  2. 无序:没有下标,不能用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,1,2,2,3,4,4,5],用两种方法去重(一种保序、一种不保序)。
  2. 找出两个字符串中都出现过的字符,如"hello"和"world"→{'l', 'o'}。
  3. 随机生成 100 个 1~50 的整数,统计其中有多少个不同的数字。

下一篇:条件判断 if——让程序学会做选择。

总结

  • 希望对初学者有帮助

  • 致力于办公自动化的小小程序员一枚

  • 希望能得到大家的【一个免费关注】!感谢

  • 求个 🤞 关注 🤞

  • 此外还有办公自动化专栏,欢迎大家订阅:Python办公自动化专栏

  • 求个 ❤️ 喜欢 ❤️

  • 此外还有爬虫专栏,欢迎大家订阅:Python爬虫基础专栏

  • 求个 👍 收藏 👍

  • 此外还有Python基础专栏,欢迎大家订阅:Python基础学习专栏

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进