引言
在Python中,集合(set)是一种无序、可变且元素唯一的数据容器,常用于去重操作和数学集合运算。本文记录集合的所有方法,通过代码示例帮助自己,也帮助读者查询学习这一重要数据结构。
一、集合特性
Python中集合有以下特性:
- 元素唯一性:集合中的所有元素只能出现一次,如果重复添加,集合会自动过滤重复项;
- 无序存储:不支持通过索引的方式访问;
- 可变对象:支持对集合内的元素进行增删操作;
- 哈希元素:只能包含不可变类型数据(如int,float等数字类型、字符串类型、元组(tuple)类型等)。
二、创建方式
# 正确创建方法
empty_set = set() # 空集合
num_set = {1, 2, 3} # 直接初始化
list_set = set([1,2,2,3]) # 列表转集合 → {1,2,3}
# 错误示范
not_set = {} # 实际创建的是字典
三、元素操作
1、添加元素
(1)add(element)
- 功能:添加单个元素
- 特性:时间复杂度O(1)
- 注意:元素必须可哈希
s = {1, 2}
s.add("apple") # 添加字符串
print(s) # 输出:{1, 2, 'apple'}
s.add([1,2]) # 报错!列表不可哈希
(2)update(iterables)
- 功能:批量添加可迭代对象元素
- 参数:支持多个可迭代参数
- 返回值:None(直接修改原集合)
s = {1, 2}
s.update([3,4], "ab", (5,))
print(s) # 输出:{1, 2, 3, 4, 5, 'a', 'b'}
2、删除元素
(1)remove(element)
- 功能:精确删除指定元素
- 风险:元素不存在时触发KeyError
s = {1,2,3}
s.remove(2) # 成功 → {1,3}
s.remove(5) # KeyError: 5
(2)discard(element)
- 功能:安全删除元素
- 优点:元素不存在时不报错
s = {1,2,3}
s.discard(2) # 成功 → {1,3}
s.discard(5) # 静默失败
(3)pop( )
- 特性:随机删除元素(因集合无序)
- 返回值:被删除的元素
- 风险:空集合调用触发KeyError
s = {'a', 'b', 'c'}
val = s.pop() # 可能返回任意元素
print(f"删除的元素:{val}")
(4)clear( )
- 功能:清空所有元素
- 内存:保留集合对象
s = {1,2,3}
s.clear()
print(s) # 输出:set()
四、集合运算
1、标准运算方法
(1)并集运算 union(*others)
a = {1,2}; b = {2,3}
result = a.union(b) # {1,2,3}
# 等效运算符 |
print(a | b | {4}) # {1,2,3,4}
(2)交集运算 intersection(*others)
a = {1,2,3}; b = {2,3,4}
print(a.intersection(b)) # {2,3}
# 多集合操作
print(a & b & {2,5}) # {2}
(3)差集运算 difference(*others)
a = {1,2,3}; b = {2,4}
print(a.difference(b)) # {1,3}
# 连续减法
print(a.difference(b, {3})) # {1}
五、集合关系判断
1、包含关系
(1)issubset(other)
{2}.issubset({1,2,3}) # True
{1,2}.issubset({1}) # False
(2)issuperset(other)
{1,2,3}.issuperset({2,3}) # True
{2,3}.issuperset({1,2,3}) # False
2、互斥判断
(1)isdisjoint(other)
# 用户标签系统应用示例
user_tags = {"python", "AI"}
article_tags = {"java", "database"}
if user_tags.isdisjoint(article_tags):
print("无关联内容")
六、不可变集合frozenset
1、特性说明
- 禁止修改操作
- 可哈希特性 → 可作为字典键
- 继承所有非破坏性集合方法
2、使用示例
fs = frozenset([1,2,3])
new_fs = fs.union({4}) # 创建新对象
dict_key = {fs: "value"} # 合法字典键
七、最佳实践场景
1、数据去重
# 快速去重并保持顺序
def deduplicate(items):
seen = set()
return [x for x in items if not (x in seen or seen.add(x))]
2、关系验证
# 权限系统示例
user_roles = {"admin", "editor"}
required_roles = {"admin"}
if required_roles.issubset(user_roles):
print("权限验证通过")
3、海量数据查找
# 10万级数据快速存在性检测
big_data = set(range(100000))
print(99999 in big_data) # 毫秒级响应