一、前言
在 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):如果元素不存在,会抛出KeyErrordiscard(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]) | 不可变 |
十、结语
感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!