Python 容器的类型(Set)
·
📚 Python 集合(Set)完整笔记
集合(
set)是 Python 中一种 无序、不重复、可变 的容器类型,用于高效地存储唯一元素,并支持数学上的集合运算(如并集、交集、差集等)。
一、集合的基本特性
| 特性 | 说明 |
|---|---|
| 无序性 | 元素没有固定顺序,不支持下标索引(如 s[0] 会报错) |
| 唯一性 | 自动去重,重复元素只保留一个 |
| 可变性 | 可以添加、删除元素(但元素本身必须是不可变类型) |
| 元素限制 | 只能包含不可变对象(如 int、str、tuple),不能包含 list、dict、set |
# ✅ 合法集合
s1 = {1, "hello", (2, 3)}
# ❌ 非法集合(会报错)
# s2 = {[1, 2], 3} # TypeError: unhashable type: 'list'
# s3 = {{1, 2}, 3} # TypeError: unhashable type: 'set'
二、集合的定义
1. 字面量定义
my_set = {"123", "456", "789", "123"} # 自动去重
print(my_set) # {'456', '123', '789'}(顺序不定)
2. 空集合定义
empty_set = set() # ✅ 正确
empty_dict = {} # ❌ 这是空字典!不是集合!
⚠️ 重要:
{}创建的是 字典(dict),不是集合!
三、集合的常用操作
1. 添加元素:add(element)
s = {"123", "456"}
s.add("Python")
print(s) # {'456', 'Python', '123'}
2. 移除元素:remove(element)
- 元素必须存在,否则报错
KeyError
s.remove("123")
print(s) # {'456', 'Python'}
💡 安全移除:用
discard(element)(不存在也不报错)
s.discard("不存在的元素") # 安静地什么都不做
3. 随机弹出元素:pop()
- 因为无序,弹出哪个不确定
- 空集合调用会报错
s = {"123", "456", "789"}
element = s.pop()
print(f"弹出: {element}, 剩余: {s}")
4. 清空集合:clear()
s.clear()
print(s) # set()
四、集合的运算(数学操作)
1. 差集:difference(other)
- 返回:在
self中但不在other中的元素 - 不修改原集合
set1 = {1, 2, 3}
set2 = {1, 5, 6}
diff = set1.difference(set2) # {2, 3}
print(diff)
✅ 等价写法:
set1 - set2
2. 差集更新:difference_update(other)
- 直接修改原集合,移除与
other的交集部分 - 返回
None
set1 = {1, 2, 3}
set2 = {1, 5, 6}
set1.difference_update(set2) # set1 变为 {2, 3}
print(set1) # {2, 3}
✅ 等价写法:
set1 -= set2
3. 并集:union(other)
- 返回:两个集合所有不重复元素的集合
- 不修改原集合
set1 = {1, 2, 3}
set2 = {1, 5, 6}
union_set = set1.union(set2) # {1, 2, 3, 5, 6}
✅ 等价写法:
set1 | set2
4. 其他常用运算(拓展)
| 操作 | 方法 | 运算符 | 说明 |
|---|---|---|---|
| 交集 | intersection() | & | 两个集合都有的元素 |
| 对称差集 | symmetric_difference() | ^ | 两个集合有但不共有的元素 |
| 子集判断 | issubset() | <= | A 是否是 B 的子集 |
| 超集判断 | issuperset() | >= | A 是否是 B 的超集 |
A = {1, 2, 3}
B = {2, 3, 4}
print(A & B) # {2, 3}(交集)
print(A ^ B) # {1, 4}(对称差集)
print({1, 2} <= A) # True({1,2} 是 A 的子集)
五、集合的遍历
- 只能用
for循环(因为无序,不支持索引) - 不能用
while+ 索引
my_set = {1, 2, 3, 4, 5}
for element in my_set:
print(element)
六、综合案例:列表去重
my_list = ["hang", "lannn", "hang", "lannn", "123", "456", "123", "456"]
# 方法1:用集合去重(最简洁)
my_set = set(my_list)
print(my_set) # {'lannn', '456', 'hang', '123'}
# 方法2:保持原顺序的去重(需用 dict 或 list)
unique_list = list(dict.fromkeys(my_list))
print(unique_list) # ['hang', 'lannn', '123', '456']
⚠️ 注意:集合去重会丢失原始顺序!如需保留顺序,用
dict.fromkeys()或collections.OrderedDict。
七、集合 vs 其他容器
| 容器 | 有序 | 可变 | 允许重复 | 主要用途 |
|---|---|---|---|---|
| list | ✅ | ✅ | ✅ | 存储有序、可变序列 |
| tuple | ✅ | ❌ | ✅ | 存储固定数据 |
| str | ✅ | ❌ | ✅ | 文本处理 |
| set | ❌ | ✅ | ❌ | 去重、成员检测、集合运算 |
| dict | ✅(Python 3.7+) | ✅ | ❌(键唯一) | 键值对映射 |
八、性能优势
- 成员检测极快:
x in my_set平均时间复杂度 O(1)(列表是 O(n)) - 去重高效:
set(my_list)是去重最快的方式
# 快速判断元素是否存在
allowed = {"admin", "user", "guest"}
if role in allowed:
print("权限通过")
✅ 总结口诀
“集合无序又唯一,可变但元素要不可变;
去重就用 set(),成员检测快如电。
add/remove/pop/clear,差集并集全支持;
遍历只能用 for,空集别写 {}!”
掌握集合,让你的数据处理更高效、更简洁!✨
更多推荐
所有评论(0)