一、前言
在 Python 中,除了我们常用的列表(list
)、元组(tuple
)和字典(dict
),还有一种非常实用的数据结构 —— 集合(set)。
集合是一种无序且不重复的元素集合,常用于去重、交并差运算等场景。本文将带你全面了解 Python 中集合的基本用法、操作方法及其适用场景,并通过大量代码示例帮助你掌握这一重要数据类型。
二、什么是集合(set)?
✅ 定义:
集合是 Python 中的一种可变数据类型,它存储的是一组无序且不重复的元素。
⚠️ 特点:
- 元素不可重复(自动去重)
- 元素是无序的(不能通过索引访问)
- 可以进行数学中的集合运算(如交集、并集、差集等)
✅ 示例:
s = {1, 2, 3, 4}
print(s) # 输出: {1, 2, 3, 4}
三、创建集合的方式
✅ 1. 使用大括号 {}
创建集合
s = {1, 2, 3, 4}
⚠️ 注意:空集合不能使用
{}
,这会创建一个空字典(dict
)!
empty_dict = {} # 空字典
empty_set = set() # 空集合
✅ 2. 使用 set()
函数转换其他序列
s1 = set([1, 2, 3, 2]) # 从列表转集合,自动去重
s2 = set("hello") # 从字符串转集合
s3 = set((1, 2, 3, 2)) # 从元组转集合
print(s1) # 输出: {1, 2, 3}
print(s2) # 输出: {'h', 'e', 'l', 'o'}
print(s3) # 输出: {1, 2, 3}
四、集合的常用操作方法
✅ 1. 添加元素:add()
s = {1, 2, 3}
s.add(4)
print(s) # 输出: {1, 2, 3, 4}
✅ 2. 删除元素:remove()
/ discard()
s = {1, 2, 3}
s.remove(2)
print(s) # 输出: {1, 3}
s.discard(4) # 不会报错
⚠️ 区别:
remove(x)
:如果元素不存在,会抛出KeyError
discard(x)
:不会抛出异常,更安全
✅ 3. 清空集合:clear()
s = {1, 2, 3}
s.clear()
print(s) # 输出: set()
✅ 4. 集合运算(交集、并集、差集、对称差集)
运算 | 方法 | 符号 | 说明 |
---|---|---|---|
并集 | union() |
` | ` |
交集 | intersection() |
& |
共同元素 |
差集 | difference() |
- |
属于 A 但不属于 B 的元素 |
对称差集 | symmetric_difference() |
^ |
不同时属于两个集合的元素 |
示例代码:
a = {1, 2, 3}
b = {3, 4, 5}
print(a.union(b)) # 输出: {1, 2, 3, 4, 5}
print(a.intersection(b)) # 输出: {3}
print(a.difference(b)) # 输出: {1, 2}
print(a.symmetric_difference(b)) # 输出: {1, 2, 4, 5}
五、集合与其他数据结构的对比
特性 | 列表(list ) |
元组(tuple ) |
字典(dict ) |
集合(set ) |
---|---|---|---|---|
是否有序 | ✅ 是 | ✅ 是 | ❌ 否(Python 3.7+为插入顺序) | ❌ 否 |
是否可变 | ✅ 是 | ❌ 否 | ✅ 是(键不变,值可变) | ✅ 是 |
是否允许重复 | ✅ 允许 | ✅ 允许 | ❌ 键不允许重复 | ❌ 不允许重复 |
是否支持索引 | ✅ 支持 | ✅ 支持 | ❌ 不支持 | ❌ 不支持 |
主要用途 | 存储有序数据 | 存储固定数据 | 存储键值对 | 去重、集合运算 |
六、集合的实际应用场景
✅ 场景1:去除列表中的重复元素
nums = [1, 2, 2, 3, 4, 4, 5]
unique_nums = list(set(nums))
print(unique_nums) # 输出: [1, 2, 3, 4, 5](顺序可能变化)
⚠️ 注意:使用
set
会丢失原有顺序,若需保留顺序可使用如下方式:
nums = [1, 2, 2, 3, 4, 4, 5]
unique = []
for n in nums:
if n not in unique:
unique.append(n)
print(unique) # 输出: [1, 2, 3, 4, 5]
✅ 场景2:判断两个集合是否相交
a = {1, 2, 3}
b = {3, 4, 5}
if a & b:
print("两个集合有交集")
else:
print("没有交集")
✅ 场景3:找出所有用户标签的唯一集合
user1_tags = {"python", "web", "data"}
user2_tags = {"java", "web", "mobile"}
all_tags = user1_tags | user2_tags
print(all_tags) # 输出: {'python', 'web', 'data', 'java', 'mobile'}
七、注意事项与常见错误
场景 | 建议 |
---|---|
集合中能否包含列表? | ❌ 不可以,集合中的元素必须是不可变类型(如数字、字符串、元组) |
集合是否可哈希? | ❌ 普通集合不可哈希,但 frozenset 是可哈希的 |
如何判断集合是否为空? | ✅ 使用 len(s) == 0 或 not s |
集合是否支持切片操作? | ❌ 不支持,因为集合是无序的 |
性能优化建议 | ✅ 查找元素是否在集合中比列表快得多(O(1) vs O(n)) |
八、冻结集合(frozenset)
如果你希望创建一个不可变的集合,可以用 frozenset()
。
fs = frozenset([1, 2, 3])
fs.add(4) # 报错:AttributeError: 'frozenset' object has no attribute 'add'
✅ 优势:
- 可作为字典的键
- 可作为其他集合的元素
九、总结对比表
操作 | 方法 | 示例 | 说明 |
---|---|---|---|
创建集合 | set() / {} |
s = {1, 2, 3} |
不允许重复 |
添加元素 | add() |
s.add(4) |
|
删除元素 | remove() / discard() |
s.remove(2) |
|
清空集合 | clear() |
s.clear() |
|
并集 | union() / ` |
` | `a |
交集 | intersection() / & |
a & b |
|
差集 | difference() / - |
a - b |
|
对称差集 | symmetric_difference() / ^ |
a ^ b |
|
冻结集合 | frozenset() |
fs = frozenset([1, 2]) |
不可变 |
十、结语
感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!