Python中的集合(set)
Python中的集合(set)是一种无序且元素唯一的数据结构,适用于成员检测、去重和数学集合运算。
1、创建集合
直接创建:
使用花括号 {},元素间用逗号分隔。
s = {1, 2, 3} # {1, 2, 3}
空集合:
必须用 set(),因为 {} 表示空字典。
empty_set = set()
从可迭代对象转换:
如列表、字符串等。
s = set([1, 2, 2, 3]) # {1, 2, 3}(去重)
s = set("hello") # {'h', 'e', 'l', 'o'}
2、集合的特性
- 元素唯一性:自动去重,重复元素会被忽略。
- 无序性:元素没有固定顺序,不支持索引访问。
- 可哈希性:集合的元素必须是不可变类型(如数字、字符串、元组),集合本身是可变对象,不可作为其他集合的元素或字典的键。若需不可变集合,使用frozenset。
3、常用操作与方法
修改集合
- 添加元素:add() 添加单个元素;update() 合并多个元素。
s.add(4) # {1, 2, 3, 4}
s.update([5, 6]) # {1, 2, 3, 4, 5, 6}
- 移除元素:
remove(e):删除指定元素,元素不存在时报错。
discard(e):安全删除,元素不存在不报错。
pop():随机删除一个元素(因集合无序)。
clear():清空集合。
集合运算
- 并集:union() 或 | 运算符。
a = {1, 2}; b = {2, 3}
a.union(b) # {1, 2, 3}
a | b # {1, 2, 3}
- 交集:intersection() 或 & 运算符。
a.intersection(b) # {2}
a & b # {2}
- 差集:difference() 或 - 运算符。
a.difference(b) # {1}
a - b # {1}
- 对称差集(不同时存在的元素):symmetric_difference() 或 ^ 运算符。
a.symmetric_difference(b) # {1, 3}
a ^ b # {1, 3}
关系判断
- 子集/超集:issubset() 和 issuperset()。
a = {1, 2}; b = {1, 2, 3}
a.issubset(b) # True
b.issuperset(a) # True
- 无交集:isdisjoint()。
a = {1}; b = {3}
a.isdisjoint(b) # True
4、集合推导式
类似列表推导式,生成集合:
s = {x for x in 'abracadabra' if x not in 'abc'} # {'d', 'r'}
5、应用场景
- 去重:快速去除列表中的重复项。
lst = [1, 2, 2, 3]
unique = list(set(lst)) # [1, 2, 3](顺序可能丢失)
- 成员检测:in 操作时间复杂度为 O(1),效率高于列表。
- 集合运算:如数据对比、交集分析等。
6、注意事项
- 无序性:遍历顺序不确定,不能依赖索引。
- 不可哈希元素:集合不能包含列表、字典等可变类型。
- 性能优势:适合频繁查找和去重,但不适合需要维护顺序的场景(此时可用 list 或 collections.OrderedDict)。
通过掌握集合的特性和方法,可以在数据处理中高效实现去重、快速查找和集合运算,提升代码简洁性和性能。