一、集合基础特性回顾
- 无序、元素唯一、可变集合
set() / 不可变集合frozenset() - 元素必须是不可变类型(数字、字符串、元组,不能列表/字典)
# 创建集合
s1 = {1, 2, 3, 4}
s2 = set([3, 4, 5, 6])
empty_set = set() # 空集合,不能用{}(空字典)
二、集合操作分类
1. 增删改(原地修改集合,仅可变set可用)
1.1 add() 添加单个元素
语法:set.add(item)
s = {1, 2, 3}
s.add(4)
print(s) # {1,2,3,4}
s.add(2) # 重复元素不报错,无效果
print(s) # {1,2,3,4}
1.2 update() 批量添加多个元素
语法:set.update(可迭代对象)支持列表、元组、字符串、另一个集合,自动拆分元素去重
s = {1, 2}
s.update([3, 4], (4, 5), "ab")
print(s) # {1,2,3,4,5,'a','b'}
1.3 remove() 删除指定元素(不存在抛错KeyError)
s = {1, 2, 3}
s.remove(2)
print(s) # {1,3}
# s.remove(99) # 不存在元素,报错 KeyError
1.4 discard() 删除指定元素(不存在不报错,推荐)
s = {1, 2, 3}
s.discard(2)
s.discard(99) # 无任何报错
print(s) # {1,3}
1.5 pop() 随机删除并返回一个元素
集合无序,无法指定删除位置,空集合调用抛错
s = {10, 20, 30}
val = s.pop()
print("删除的元素:", val)
print("剩余集合:", s)
1.6 clear() 清空集合所有元素
s = {1, 2, 3}
s.clear()
print(s) # set()
2. 集合数学运算(交集、并集、差集、对称差集)
两种写法:运算符 / 内置方法,方法支持传入可迭代对象,运算符只能集合之间运算
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
2.1 交集 intersection() &
同时存在于两个集合的元素
# 运算符
print(a & b) # {3,4}
# 内置函数
print(a.intersection(b)) # {3,4}
# 多集合交集
print(a.intersection(b, {3, 7})) # {3}
2.2 并集 union() |
两个集合所有元素,自动去重
print(a | b) # {1,2,3,4,5,6}
print(a.union(b, [6, 7])) # 可传列表
2.3 差集 difference() -
只在A、不在B的元素
print(a - b) # {1,2}
print(a.difference(b))
print(b - a) # {5,6}
2.4 对称差集 symmetric_difference() ^
只在其中一个集合,不同时存在的元素
print(a ^ b) # {1,2,5,6}
print(a.symmetric_difference(b))
3. 原地更新运算(修改原集合,无返回值)
intersection_update() 原地交集
s = {1,2,3,4}
s.intersection_update({3,4,5})
print(s) # {3,4}
update() / |= 原地并集
s = {1,2}
s |= {2,3}
print(s) # {1,2,3}
difference_update() / -= 原地差集
s = {1,2,3,4}
s -= {3,4}
print(s) # {1,2}
symmetric_difference_update() / ^= 原地对称差
s = {1,2,3}
s ^= {3,4}
print(s) # {1,2,4}
4. 子集、超集、不相交判断(返回布尔值True/False)
x = {1, 2}
y = {1, 2, 3}
z = {4, 5}
issubset() / <= 判断子集
A所有元素都在B中:A是B子集
print(x.issubset(y)) # True
print(x <= y) # True
print(y <= x) # False
issuperset() / >= 判断超集
B包含A全部元素:B是A超集
print(y.issuperset(x)) # True
print(y >= x) # True
isdisjoint() 判断是否无交集(完全不重合)
两个集合没有共同元素返回True
print(x.isdisjoint(z)) # True
print(x.isdisjoint(y)) # False
5. 通用内置函数(Python全局函数,非set方法)
len() 获取集合元素个数
s = {1, 2, 3}
print(len(s)) # 3
max() min() 最大最小值(元素必须可比较)
s = {5, 2, 9, 1}
print(max(s), min(s)) # 9 1
sorted() 将集合转为有序列表
集合本身无序,排序后返回list
s = {4, 1, 3, 2}
lst = sorted(s)
print(lst) # [1,2,3,4]
list() / tuple() 集合转列表、元组
s = {1,2,3}
print(list(s))
print(tuple(s))
三、不可变集合 frozenset
无增删改方法(add/update/remove/pop/clear 全部不能用),可作为字典key
fs = frozenset([1,2,3])
print(fs & frozenset([3,4]))
# fs.add(5) # 报错,不可修改
四、完整综合演示代码
# 1. 创建集合
set1 = {1, 2, 3, 4, 5}
set2 = {4, 5, 6, 7, 8}
print("原始集合1:", set1)
print("原始集合2:", set2)
# 2. 增删操作
set1.add(9)
set1.update([10, 11])
print("add+update后:", set1)
set1.discard(11)
set1.remove(10)
print("删除元素后:", set1)
# 3. 集合数学运算
print("交集 &:", set1 & set2)
print("并集 |:", set1 | set2)
print("差集 -:", set1 - set2)
print("对称差 ^:", set1 ^ set2)
# 4. 子集超集判断
temp = {4,5}
print("temp是set1子集?", temp.issubset(set1))
print("set1是temp超集?", set1.issuperset(temp))
print("无交集?", temp.isdisjoint({100, 200}))
# 5. 原地修改
test_set = {1,2,3}
test_set.intersection_update({2,3,4})
print("原地交集后:", test_set)
# 6. 通用函数
print("集合长度:", len(set1))
print("排序转列表:", sorted(set1))
五、常用方法速查表