当前位置:首页>python>Python Set 集合完整总结

Python Set 集合完整总结

  • 2026-10-11 06:22:05
Python Set 集合完整总结

一、集合基础概念

1. 定义

集合(set)是无序、可变、元素唯一的数据容器,底层哈希表实现。 核心特性:

  1. 元素去重:自动剔除重复值
  2. 无序:不支持下标索引、切片
  3. 元素类型限制:只能存可哈希(不可变) 类型:int/float/str/tuple;不能存 list/dict/set
  4. 可变集合 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. 添加元素

方法
作用
特点
add(x)
添加单个元素
重复添加无报错,自动忽略
update(可迭代对象)
批量添加多个元素
接收列表、字符串、元组、另一个集合
s = {1,2}
s.add(3)
s.update([4,5], "ab")
print(s)  # {1,2,3,4,5,'a','b'}

2. 删除元素

方法
作用
元素不存在时报错?
remove(x)
删除指定元素
不存在 → KeyError
discard(x)
删除指定元素
不存在 → 无任何报错
pop()
随机删除并返回一个元素
空集合调用报错
clear()
清空集合所有元素
无报错
s = {1,2,3}
s.discard(99)  # 无异常
s.remove(2)
s.pop()
s.clear()

3. 查询与判断

  1. 成员判断 in / not in,查询效率远高于列表(哈希O(1))
s = {10,20,30}
print(10in s)   # True
print(99notin s) # True
  1. 获取长度 len(set)
  2. 遍历:for 循环直接迭代
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. 交集:两者共有元素

  • 符号 & / 方法 intersection()
print(a & b)              # {3,4}
print(a.intersection(b))

2. 并集:全部元素,去重

  • 符号 | / 方法 union()
print(a | b)               # {1,2,3,4,5,6}
print(a.union(b))

3. 差集:只在A有、B没有

  • 符号 - / 方法 difference()
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 区别

  1. set:可变,支持add/remove/update,不能作为字典键
  2. frozenset:不可变,无增删方法,哈希可哈希,可当字典key
fs = frozenset([1,2])
d = {fs: "测试"} # 合法

七、集合优缺点与适用场景

优点

  1. 元素自动去重,一行代码完成列表去重
  2. in 判断速度极快,海量数据查询优于list
  3. 便捷实现交集、并集、差集等数学集合逻辑

缺点

  1. 无序,无法通过下标取值,不能保存元素原有顺序
  2. 元素必须不可变,无法存放列表、字典
  3. 不能存储重复数据,需要保留重复值时不能用集合

常用场景

  1. 列表/字符串快速去重
  2. 判断两个列表的重合、差异数据
  3. 海量数据成员存在性校验(黑名单、白名单)
  4. 数据筛选、对比(用户交集、商品共同标签)

八、常见易错点

  1. 空集合不能写 {},{} 是空字典,必须 set()
  2. 集合无顺序,每次打印输出顺序不固定,不要依赖顺序
  3. 列表、字典不能放入集合,会报 TypeError: unhashable type
  4. 遍历集合时不要同时增删元素,会引发遍历错乱
  5. remove() 元素不存在报错,不确定元素是否存在优先用 discard()

最新文章

随机文章