Python 数据类型 - 集合(set)
1. 集合简介
集合(set)是Python中的一种无序、可变、不重复元素的容器数据类型。集合的主要用途:
- 快速成员检测(判断元素是否存在)
- 去除重复项
- 执行数学集合运算(并集、交集、差集等)
2. 创建集合
2.1 使用花括号
fruits = {'apple', 'banana', 'orange'} # 注意:空{}创建的是字典,不是集合
2.2 使用set()构造函数
numbers = set([1, 2, 3, 4]) # 从列表创建
chars = set("hello") # 从字符串创建 → {'h', 'e', 'l', 'o'}(自动去重)
empty_set = set() # 创建空集合的正确方式
3. 集合基本操作
3.1 添加元素
s = {1, 2}
s.add(3) # {1, 2, 3}
s.update([4,5]) # {1, 2, 3, 4, 5} 添加多个元素
3.2 删除元素
s = {1, 2, 3, 4}
s.remove(3) # {1, 2, 4} (元素不存在会报KeyError)
s.discard(5) # 安全删除(元素不存在不会报错)
s.pop() # 随机删除并返回一个元素
s.clear() # 清空集合
3.3 成员检测
colors = {'red', 'blue', 'green'}
'red' in colors # True
'yellow' not in colors # True
4. 集合运算
4.1 并集 (| 或 union())
a = {1, 2}; b = {2, 3}
a | b # {1, 2, 3}
a.union(b) # 同上
4.2 交集 (& 或 intersection())
a & b # {2}
a.intersection(b) # 同上
4.3 差集 (- 或 difference())
a - b # {1}
a.difference(b) # 同上
4.4 对称差集 (^ 或 symmetric_difference())
a ^ b # {1, 3}
a.symmetric_difference(b) # 同上
5. 集合方法速查
方法 | 描述 |
---|---|
add() | 添加单个元素 |
update() | 添加多个元素 |
remove() | 删除指定元素(不存在则报错) |
discard() | 删除指定元素(不存在不报错) |
pop() | 随机删除并返回一个元素 |
clear() | 清空集合 |
copy() | 浅拷贝集合 |
union() | 返回并集 |
intersection() | 返回交集 |
difference() | 返回差集 |
symmetric_difference() | 返回对称差集 |
issubset() | 判断是否为子集 |
issuperset() | 判断是否为超集 |
isdisjoint() | 判断是否无交集 |
6. 集合特性
-
无序性:集合元素没有固定顺序
print({1,2,3} == {3,2,1}) # True
-
元素唯一性:自动去除重复
set([1,1,2,2,3]) # {1, 2, 3}
-
不可哈希元素:集合元素必须是不可变类型(不能包含列表、字典等可变类型)
7. 冻结集合(frozenset)
不可变的集合类型:
fs = frozenset([1,2,3])
# fs.add(4) # 报错:frozenset不可修改
8. 实际应用示例
8.1 列表去重
lst = [1,2,2,3,4,4]
unique = list(set(lst)) # [1,2,3,4](顺序可能变化)
8.2 词频统计
words = ["apple", "banana", "apple", "orange"]
unique_words = set(words) # {'apple', 'banana', 'orange'}
8.3 权限系统
user_permissions = {'read', 'write'}
required_permissions = {'read', 'execute'}
if user_permissions & required_permissions == required_permissions:
print("权限足够")
9. 性能特点
- 成员检测:O(1) 时间复杂度(比列表的O(n)快)
- 元素添加/删除:平均O(1)时间复杂度
- 不适合需要维护元素顺序的场景