一、集合基础概念
1. 定义
集合(set)是无序、可变、元素唯一的数据容器,底层哈希表实现。 核心特性:
- 元素类型限制:只能存可哈希(不可变) 类型:
int/float/str/tuple;不能存 list/dict/set - 可变集合 set:支持增删元素;不可变集合 frozenset:创建后无法修改,可做字典key
2. 创建方式
# 1. 字面量 {},空集合不能用{}({}是空字典)
s1 = {1, 2, 3, 3, 2}
print(s1) # {1,2,3} 自动去重
# 2. set() 构造器
s2 = set([1,2,2,4])
s3 = set("aabbcc") # {'a','b','c'}
# 3. 空集合
empty = set()
# 4. 不可变集合
fs = frozenset({1,2,3})
二、集合常用操作(增、删、查、遍历)
1. 添加元素
s = {1,2}
s.add(3)
s.update([4,5], "ab")
print(s) # {1,2,3,4,5,'a','b'}
2. 删除元素
| | |
|---|
remove(x) | | |
discard(x) | | |
pop() | | |
clear() | | |
s = {1,2,3}
s.discard(99) # 无异常
s.remove(2)
s.pop()
s.clear()
3. 查询与判断
- 成员判断
in / not in,查询效率远高于列表(哈希O(1))
s = {10,20,30}
print(10in s) # True
print(99notin s) # True
for i in {1,2,3}:
print(i)
4. 类型转换
# 列表去重
lst = [1,1,2,3]
new_lst = list(set(lst))
# 字符串去重
res = ''.join(set("hello"))
三、集合数学运算(核心)
设两个集合 a = {1,2,3,4},b = {3,4,5,6}
1. 交集:两者共有元素
print(a & b) # {3,4}
print(a.intersection(b))
2. 并集:全部元素,去重
print(a | b) # {1,2,3,4,5,6}
print(a.union(b))
3. 差集:只在A有、B没有
print(a - b) # {1,2}
print(b - a) # {5,6}
4. 对称差集:只在其中一个存在(排除交集)
- 符号
^ / 方法 symmetric_difference()
print(a ^ b) # {1,2,5,6}
5. 子集、超集判断
x = {1,2}
y = {1,2,3}
# 子集:x全部元素都在y中
print(x.issubset(y)) # True 等价 x <= y
# 真子集
print(x < y) # True
# 超集:y包含x全部元素
print(y.issuperset(x)) # True 等价 y >= x
# 真超集
print(y > x) # True
6. 不相交判断(无共同元素)
a = {1,2}
b = {3,4}
print(a.isdisjoint(b)) # True
四、原地修改运算(更新自身集合)
a = {1,2,3}
b = {3,4,5}
a.intersection_update(b) # 原地交集 a = a & b
a.difference_update(b) # 原地差集
a.symmetric_difference_update(b) # 原地对称差
a.update(b) # 原地并集
五、集合推导式 Set Comprehension
格式:{表达式 for 变量 in 可迭代对象 if 条件}
# 示例1:列表去重,只保留偶数
lst = [1,2,2,3,4,4,5]
s = {x for x in lst if x % 2 == 0}
print(s) # {2,4}
# 示例2:字符串提取大写字母
text = "AaBbCc123"
upper_set = {c for c in text if c.isupper()}
六、set vs frozenset 区别
set:可变,支持add/remove/update,不能作为字典键frozenset:不可变,无增删方法,哈希可哈希,可当字典key
fs = frozenset([1,2])
d = {fs: "测试"} # 合法
七、集合优缺点与适用场景
优点
缺点
常用场景
八、常见易错点
- 空集合不能写
{},{} 是空字典,必须 set() - 列表、字典不能放入集合,会报
TypeError: unhashable type remove() 元素不存在报错,不确定元素是否存在优先用 discard()