跳到主要内容
Python 集合(Set)CURD 操作与集合运算详解 | 极客日志
Python 算法
Python 集合(Set)CURD 操作与集合运算详解 综述由AI生成 Python 集合(Set)是内置无序可变容器类型,支持自动去重。详细讲解了集合的增删改查(CURD)操作,包括创建空集合、添加元素、批量更新、成员检测、遍历及关系判断。同时深入分析了各操作的时间复杂度,并涵盖了集合间的交并差补运算及其原地修改方法。通过对比运算符与方法,提供了实际应用场景示例,帮助开发者高效掌握 Python 集合的使用技巧与性能特征。
星落 发布于 2026/3/21 更新于 2026/5/30 26 浏览Python 集合(Set)CURD 操作详解
本文聚焦 Python 集合的四大基础操作:增(Create)、查(Read)、删(Delete)、改(Update) ,包含详细示例与时间复杂度分析。
一、增(Create)
1.1 创建集合
empty = set ()
type (empty)
not_empty = {}
type (not_empty)
nums = set ([1 , 2 , 3 , 2 , 1 ])
chars = set ("hello" )
colors = {"red" , "green" , "blue" }
single = {1 ,}
range_set = set (range (5 ))
时间复杂度 :set(iterable) 为 O(n) ,n 为可迭代对象长度
1.2 添加单个元素 add()
s = {1 , 2 , }
s.add( )
s.add( )
s.add( )
s.add(( , ))
s.add( )
3
4
3
"hello"
1
2
3.14
时间复杂度 :add(x) 为 O(1) (平均情况)
1.3 批量添加 update() s = {1 , 2 , 3 }
s.update([4 , 5 , 6 ])
s.update({7 , 8 , 9 })
s.update("abc" )
s.update((10 , 11 ))
s.update(range (12 , 15 ))
s |= {15 , 16 }
时间复杂度 :update(iter) 为 O(k) ,k 为添加的元素数量
二、查(Read)
2.1 成员检测 in s = {"apple" , "banana" , "cherry" }
"apple" in s
"grape" in s
"orange" not in s
nums = {1 , 2 , 3 , 4 , 5 }
3 in nums
10 in nums
points = {(0 , 0 ), (1 , 1 ), (2 , 2 )}
(1 , 1 ) in points
(3 , 3 ) in points
时间复杂度 :x in s 为 O(1) (平均情况)
2.2 获取元素数量 len() s = {1 , 2 , 3 , 4 , 5 }
len (s)
len (set ())
lst = [1 , 2 , 2 , 3 , 3 , 3 ]
len (set (lst))
2.3 遍历集合 s = {"a" , "b" , "c" , "d" }
for item in s:
print (item)
for i, item in enumerate (s):
print (f"{i} : {item} " )
nums = {10 , 20 , 30 , 40 , 50 }
for num in nums:
print (num * 2 )
2.4 检查集合关系 set_a = {1 , 2 , 3 }
set_b = {1 , 2 , 3 , 4 , 5 }
set_c = {1 , 2 }
set_c.issubset(set_a)
set_c.issubset(set_b)
set_c <= set_a
set_a <= set_a
set_c < set_a
set_a < set_a
set_b.issuperset(set_a)
set_a.issuperset(set_c)
set_b >= set_a
set_a >= set_a
set_b > set_a
set_a > set_a
{1 , 2 }.isdisjoint({3 , 4 })
{1 , 2 }.isdisjoint({2 , 3 })
时间复杂度 :关系检查为 O(min(len(s1), len(s2)))
2.5 复制集合 s = {1 , 2 , 3 , 4 , 5 }
s_copy = s.copy()
s.add(6 )
print (s)
print (s_copy)
s_copy2 = set (s)
三、删(Delete)
3.1 删除指定元素 remove() s = {1 , 2 , 3 , 4 , 5 }
s.remove(3 )
s.remove(1 )
s.remove(5 )
if 10 in s:
s.remove(10 )
else :
print ("10 不在集合中" )
时间复杂度 :remove(x) 为 O(1) (元素存在时)
3.2 安全删除 discard() s = {1 , 2 , 3 , 4 , 5 }
s.discard(3 )
s.discard(10 )
s.discard(1 )
s.discard(2 )
s.discard(100 )
3.3 删除并返回 pop() s = {1 , 2 , 3 , 4 , 5 }
element = s.pop()
print (element)
print (s)
while s:
elem = s.pop()
print (f"弹出:{elem} , 剩余:{s} " )
注意 :集合无序,pop() 删除的是"任意"元素,不是特定位置
时间复杂度 :pop() 为 O(1)
3.4 清空集合 clear() s = {1 , 2 , 3 , 4 , 5 }
s.clear()
print (s)
len (s)
s = {1 , 2 , 3 }
s.clear()
s
3.5 删除多个元素 s = {1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 }
s.difference_update({2 , 4 , 6 , 8 })
s -= {1 , 9 }
s.intersection_update({3 , 4 , 5 })
odd_set = {1 , 3 , 5 , 7 , 9 }
s = {1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 }
s.intersection_update(odd_set)
时间复杂度 :批量删除为 O(len(s_to_remove))
四、改(Update) 集合本身是无序 的,没有"修改特定位置元素"的概念。
4.1 删除旧值,添加新值 s = {1 , 2 , 3 , 4 , 5 }
s.discard(3 )
s.add(30 )
s.discard(1 )
s.discard(2 )
s.add(10 )
s.add(20 )
4.2 使用集合运算修改 s = {1 , 2 , 3 , 4 , 5 }
s = s | {10 , 20 , 30 }
s = s & {2 , 4 , 6 , 8 }
s = s - {4 }
s = s ^ {2 , 3 , 4 }
4.3 原地修改运算符 a = {1 , 2 , 3 }
b = {3 , 4 , 5 }
a |= b
print (a)
a &= {2 , 4 , 6 }
print (a)
a -= {4 }
print (a)
a ^= {2 , 3 , 4 }
print (a)
五、集合运算(交并差补)
5.1 并集(Union) a = {1 , 2 , 3 }
b = {3 , 4 , 5 }
c = {5 , 6 , 7 }
result = a.union(b)
result = a | b
result = a | b | c
result = a.union(b, c)
5.2 交集(Intersection) a = {1 , 2 , 3 , 4 }
b = {3 , 4 , 5 , 6 }
c = {4 , 5 , 6 }
result = a.intersection(b)
result = a & b
result = a & b & c
result = a.intersection(b, c)
时间复杂度 :O(min(len(a), len(b)))
5.3 差集(Difference) a = {1 , 2 , 3 , 4 , 5 }
b = {4 , 5 , 6 , 7 }
result = a.difference(b)
result = a - b
result = b - a
print (a - b == b - a)
5.4 对称差集(Symmetric Difference)
什么是对称差? 对称差 :返回只在一个集合中出现 的元素,即"非共有"元素。
基础用法 a = {1 , 2 , 3 , 4 }
b = {3 , 4 , 5 , 6 }
result = a.symmetric_difference(b)
result = a ^ b
与其他运算对比 a = {1 , 2 , 3 , 4 }
b = {3 , 4 , 5 , 6 }
print (f"A: {a} " )
print (f"B: {b} " )
print (f"并集:{a | b} " )
print (f"交集:{a & b} " )
print (f"差集:{a - b} " )
print (f"差集:{b - a} " )
print (f"对称差:{a ^ b} " )
等价表达式
result = (a | b) - (a & b)
result = (a - b) | (b - a)
实际应用场景
old_version = {"a" , "b" , "c" , "d" }
new_version = {"b" , "c" , "e" , "f" }
changed = old_version ^ new_version
group_a = {"苹果" , "香蕉" , "橙子" }
group_b = {"香蕉" , "葡萄" , "西瓜" }
exclusive = group_a ^ group_b
set1 = {1 , 2 , 3 , 4 , 5 }
set2 = {4 , 5 , 6 , 7 , 8 }
different = set1 ^ set2
a = {1 , 2 }
b = {2 , 3 }
c = {3 , 4 }
result = a ^ b ^ c
原地对称差 a = {1 , 2 , 3 , 4 }
a ^= {3 , 4 , 5 , 6 }
5.5 集合运算汇总 运算 方法 运算符 描述 返回新集合 原地运算符 并集 union()` ` (竖线) 两集合所有元素 ✅ 交集 intersection()& (且号)两集合共有的元素 ✅ &=差集 difference()- (减号)a 有但 b 没有的 ✅ -=对称差 symmetric_difference()^ (脱字符)只在一个集合中的 ✅ ^=
|:并集(键盘上 Enter 键上方的那个键)
&:交集(Shift + 7)
^:对称差(Shift + 6)
-:差集(减号)
a = {1 , 2 }
b = {2 , 3 }
a | b
a & b
a - b
a ^ b
5.6 原地运算符 a = {1 , 2 , 3 }
b = {3 , 4 , 5 }
a |= b
a &= {2 , 4 , 6 }
a -= {4 }
a ^= {2 , 3 , 4 }
六、操作复杂度总结 操作 方法/运算符 平均复杂度 说明 创建 set(iterable)O(n) n 为可迭代对象长度 添加 add(x)O(1) 均摊 批量添加 update(iter)O(k) k 为添加长度 成员检测 x in sO(1) 平均 长度 len(s)O(1) 删除 remove(x)O(1) 元素存在时 安全删除 discard(x)O(1) 弹出 pop()O(1) 删除任意元素 清空 clear()O(1) 复制 copy()O(n) n 为集合大小 遍历 for x in sO(n) n 为集合大小 并集 `s1 s2` O(m+n) 交集 s1 & s2O(min(m,n)) 遍历较小集合 差集 s1 - s2O(m) m 为 s1 长度 对称差 s1 ^ s2O(m+n) m, n 为两集合长度 关系检查 issubset/issupersetO(min(m,n)) 子集/超集检查
七、总结 操作类别 方法/运算符 要点 创建 set(), {}set() 创建空集合,{} 创建空字典添加 add(), update()add() 单个 O(1),update() 批量 O(k)删除 remove(), discard(), pop(), clear()remove() 元素不存在报错,discard() 不报错查询 in, len(), 遍历in 检测 O(1),len() O(1)关系 issubset(), issuperset(), isdisjoint()子集/超集/无交集判断 并集 ` , union()`交集 &, intersection()两集合共有元素 差集 -, difference()a 有 b 没有 对称差 ^, symmetric_difference()只在一个集合中 原地运算 ` =, &=, -=, ^=`
目录
Python 集合(Set)CURD 操作详解 一、增(Create) 1.1 创建集合 空集合(注意:不能用 {} 创建空集合) {} 实际上是空字典 从可迭代对象创建 从字符串创建 直接创建(花括号语法) 创建单元素集合 从范围创建 1.2 添加单个元素 add() 添加元素 添加已存在的元素(无效果,不报错) 添加不同类型 {1, 2, 3, 4, 'hello', (1, 2), 3.14} ⚠️ 无法添加不可哈希元素 s.add([1, 2]) # TypeError: unhashable type: 'list' s.add({1, 2}) # TypeError: unhashable type: 'set' 1.3 批量添加 update() 添加列表中的元素 添加另一个集合 添加字符串(逐字符添加) 添加元组 添加范围 update 等价于 |= 运算符 二、查(Read) 2.1 成员检测 in in 运算符 not in 运算符 检测数字 检测元组(元组可哈希) 2.2 获取元素数量 len() len() 函数 空集合 去重后的数量 2.3 遍历集合 for 循环遍历 注意:集合无序,输出顺序不确定 使用 enumerate 获取索引 0: a 1: b 2: c 3: d (顺序可能不同) 遍历数字集合 20, 40, 60, 80, 100(顺序可能不同) 2.4 检查集合关系 issubset(): 是否子集 <= 运算符:子集(包含自身) < 运算符:真子集(不包含自身) issuperset(): 是否超集 >= 运算符:超集(包含自身) > 运算符:真超集(不包含自身) isdisjoint(): 是否无交集 2.5 复制集合 copy() 方法:浅拷贝 修改原集合不影响副本 等价于 set() 构造函数 三、删(Delete) 3.1 删除指定元素 remove() 删除元素 删除多个 ⚠️ 元素不存在时抛出 KeyError s.remove(10) # KeyError: 10 安全删除:先检查 3.2 安全删除 discard() 删除存在的元素 删除不存在的元素(不报错) 连续删除 {4, 5} 3.3 删除并返回 pop() 删除并返回任意元素 连续弹出 空集合调用 pop 抛出 KeyError set().pop() # KeyError: pop from an empty set 3.4 清空集合 clear() 清空所有元素 验证清空后为空 重新赋值 3.5 删除多个元素 difference_update(): 删除多个元素 等价于 -= 运算符 保留指定元素(删除不在指定集合中的元素) 保留奇数 四、改(Update) 4.1 删除旧值,添加新值 方式:先删除,再添加 替换多个值 4.2 使用集合运算修改 并集:添加多个元素 交集:只保留指定元素 差集:删除指定元素 对称差:保留不共有的元素 4.3 原地修改运算符 原地并集(修改 a) 原地交集 原地差集 原地对称差 五、集合运算(交并差补) 5.1 并集(Union) union() 方法 | 运算符 多个集合的并集 5.2 交集(Intersection) intersection() 方法 & 运算符 多个集合的交集 5.3 差集(Difference) difference() 方法:a 有但 b 没有的 - 运算符 反向差集:b 有但 a 没有的 ⚠️ 差集不满足交换律 5.4 对称差集(Symmetric Difference) 什么是对称差? 基础用法 symmetric_difference() 方法 解释:1,2 只在 a 中;5,6 只在 b 中;3,4 在两者中(被排除) ^ 运算符(更简洁) 与其他运算对比 等价表达式 对称差 = 并集 - 交集 对称差 = (a-b) 的并集 (b-a) 实际应用场景 1. 找出变化:比较新旧版本 所有变化的项(新增 + 删除) a, d 是删除的;e, f 是新增的 2. 找出独有元素 只在一个组中出现的水果 香蕉在两组都有,所以不在结果中 3. 比较两个集合的差异 找出不同的元素 4. 多个集合的对称差 链式对称差 解释:出现奇数次的元素保留,出现偶数次的去除 1 出现 1 次 → 保留 2 出现 2 次 → 去除 3 出现 2 次 → 去除 4 出现 1 次 → 保留 原地对称差 原地修改 a 等价于 a.symmetricdifferenceupdate({3, 4, 5, 6}) 5.5 集合运算汇总 快速示例 5.6 原地运算符 原地并集(a |= b 修改 a,不返回新集合) 等价于 a.update(b) 原地交集 等价于 a.intersection_update({2, 4, 6}) 原地差集 等价于 a.difference_update({4}) 原地对称差 等价于 a.symmetricdifferenceupdate({2, 3, 4}) 六、操作复杂度总结 七、总结 相关免费在线工具 加密/解密文本 使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
Gemini 图片去水印 基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online
curl 转代码 解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
Base64 字符串编码/解码 将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
Base64 文件转换器 将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
Markdown转HTML 将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online