🚀 什么是集合?
集合是Python中的一种数据容器,它有三个核心特点:
元素不重复——自动去重,绝不含糊
无序——没有下标,不能像列表那样索引
可变——可以增删改查
就像一个装东西的盒子,每个东西都是独一无二的,没有先后顺序。
有点像高中数学中的集合。
📦 定义集合
方式一:使用 {} 大括号
# 定义一个集合s4 = {'前端', 'AI', '日志'}print(s4) # {'前端', '日志', 'AI'} 每次打印顺序不一样# 自动去重!s2 = {1, 2, 2, 3, 3, 3, 4}print(s2) # {1, 2, 3, 4}
方式二:使用 set() 和 frozenset() 函数
# 空集合(注意:{} 是空字典,不是空集合!)s1 = set()print(s) # set()# 将列表转成集合(自动去重)list1 = [1, 2, 2, 3, 3, 3]s2 = set(list1)print(s) # {1, 2, 3}# 定义不可变集合s3 = frozenset({1,2,3,4,2})print(s3) # frozenset({1, 2, 3, 4})# 只有不可元素才能嵌入集合中list2 = (1,2)list3 = [1,2]s4 = frozenset({1,2})s5 = {1,2}s6 = {list2,3,4}s7 = {list3,3,4} # 报错,list3可变s8 = {s4,3,4}s9 = {s5,3,4} # 报错,s5是可变集合
⚠️ 踩坑提醒:{} 是空字典,不是空集合!空集合必须用 set() 定义。
✏️ 增删改查操作
1. 添加元素
s = {1, 2, 3}# 添加单个元素s.add(4)print(s) # {1, 2, 3, 4}# 添加多个元素(可以是列表、元组、集合等)s.update([5, 6, 7])print(s) # {1, 2, 3, 4, 5, 6, 7}
2. 删除元素
s = {1, 2, 3, 4, 5}# 删除指定元素(如果不存在会报错)s.remove(3)print(s) # {1, 2, 4, 5}# 删除指定元素(如果不存在不会报错)s.discard(100) # 什么都不会发生# 随机删除一个元素deleted = s.pop()print(deleted) # 随机返回一个被删除的元素print(s) # 剩下的元素# 清空集合s.clear()print(s) # set()
3. 查询元素
s = {1, 2, 3, 4, 5}# 判断元素是否在集合中print(3 in s) # Trueprint(10 in s) # False
💡 小贴士:集合的查找速度超级快!比列表快多了,因为它用了哈希表。
🔧 常用方法
s = {1, 2, 3, 4, 5}# 获取元素个数print(len(s)) # 5# 复制集合s2 = s.copy()print(s2) # {1, 2, 3, 4, 5}
🔢 数学运算(集合的核心优势!)
集合最大的亮点、最实用就是支持数学中的集合运算!
1. 并集(| 或 union)
两个集合所有的元素合在一起
# 类似高中数学中并集s1 = {1, 2, 3}s2 = {3, 4, 5}# 两种方式print(s1 | s2) # {1, 2, 3, 4, 5}print(s1.union(s2)) # {1, 2, 3, 4, 5}
2. 交集(& 或 intersection)
两个集合都有的元素
s1 = {1, 2, 3}s2 = {3, 4, 5}print(s1 & s2) # {3}print(s1.intersection(s2)) # {3}
3. 差集(- 或 difference)
在第一个集合有,但第二个集合没有的元素
s1 = {1, 2, 3}s2 = {3, 4, 5}print(s1 - s2) # {1, 2}print(s1.difference(s2)) # {1, 2}s1.difference_update(s2) # difference_update 会改变集合s1print(s1) # {1, 2}
4. 对称差集(^ 或 symmetric_difference)
两个集合各自独有的元素(去掉交集)
s1 = {1, 2, 3}s2 = {3, 4, 5}print(s1 ^ s2) # {1, 2, 4, 5}print(s1.symmetric_difference(s2)) # {1, 2, 4, 5}
5. 子集与超集
s1 = {1, 2, 3}s2 = {1, 2, 3, 4, 5}s3 = {6, 7}# 判断是否是子集print(s1.issubset(s2)) # True(s1 是 s2 的子集)# 判断是否是超集print(s2.issuperset(s1)) # True(s2 是 s1 的超集,s2包含了s1所有元素,返回True)# 判断是否是交集print(s3.isdisjoint(s2)) # True, 只要有一个公共元素,则返回False
🔄 循环遍历
s = {1, 2, 3, 4, 5}# 直接遍历元素for item in s: print(item)
⚠️ 注意:集合是无序的,遍历顺序不固定!
🎯 实战案例
案例1:列表去重
# 有一个包含重复数据的列表names = ['张三', '李四', '王五', '张三', '李四', '赵六']# 转成集合去重,再转回列表unique_names = list(set(names))print(unique_names) # ['张三', '李四', '王五', '赵六'](顺序可能不同)
案例2:找出共同好友
# 小明的好友xiaoming_friends = {'张三', '李四', '王五', '赵六'}# 小红的好友xiaohong_friends = {'李四', '王五', '钱七', '孙八'}# 共同好友(交集)common_friends = xiaoming_friends & xiaohong_friendsprint('共同好友:', common_friends) # {'李四', '王五'}# 小明的独有的好友only_xiaoming = xiaoming_friends - xiaohong_friendsprint('小明独有的好友:', only_xiaoming) # {'张三', '赵六'}# 所有好友(并集)all_friends = xiaoming_friends | xiaohong_friendsprint('所有好友:', all_friends)
📊 列表、元组、集合对比
特性 | 列表 | 元组 | 集合 |
|---|
是否有序 | ✅ 是 | ✅ 是 | ❌ 否 |
是否可变 | ✅ 是 | ❌ 否 | ✅ 是 |
是否允许重复 | ✅ 是 | ✅ 是 | ❌ 否 |
下标索引 | ✅ 可以 | ✅ 可以 | ❌ 不可以 |
查找速度 | 较慢 | 较慢 | 极快 |