大家好,我是唐叔。今天咱们来聊聊Python中一个既熟悉又陌生的数据类型——集合(Set)。很多同学平时用列表(List)用得多,但遇到需要去重或者快速查找的场景时,集合才是真正的性能利器。下面我就带大家全面了解这个强大的容器类型。
文章目录
一、集合是什么?
集合是Python中的一种无序、可变的数据类型,用于存储唯一的元素。它用大括号{}
表示,或者用set()
函数创建。
# 创建集合
fruits = {'apple', 'banana', 'orange'}
empty_set = set() # 注意:{}创建的是空字典,不是空集合
集合有三大特性:
- 无序性:元素没有固定顺序
- 唯一性:自动去除重复元素
- 可变性:可以增删元素,但元素本身必须不可变(数字、字符串、元组等)
二、集合的常见操作
1. 基本操作
和列表类似,集合也有添加元素、删除元素等基本操作。
# 添加元素
fruits.add('pear')
# 删除元素
fruits.remove('apple') # 不存在会报错
fruits.discard('apple') # 不存在不会报错
# 随机弹出一个元素
popped = fruits.pop()
# 清空集合
fruits.clear()
2. 集合运算
和列表很大的区别,集合最强大的地方在于它能进行数学上的集合运算。
a = {1, 2, 3}
b = {2, 3, 4}
# 并集
print(a | b) # {1, 2, 3, 4}
print(a.union(b)) # 同上
# 交集
print(a & b) # {2, 3}
print(a.intersection(b)) # 同上
# 差集
print(a - b) # {1}
print(a.difference(b)) # 同上
# 对称差集(仅在其中一个集合中的元素)
print(a ^ b) # {1, 4}
print(a.symmetric_difference(b)) # 同上
3. 成员测试
集合的查找效率是 O ( 1 ) \small{O(1)} O(1) ,远高于列表的 O ( n ) \small{O(n)} O(n)。
numbers = {1, 2, 3, 4, 5}
print(3 in numbers) # True
三、集合的使用场景
1. 数据去重(唐叔最常用)
names = ['Alice', 'Bob', 'Alice', 'Charlie']
unique_names = list(set(names)) # 快速去重
2. 关系测试
# 找出两个列表的共同元素
list1 = [1, 2, 3, 4]
list2 = [3, 4, 5, 6]
common = set(list1) & set(list2)
3. 高效查找
当需要频繁检查元素是否存在时,使用集合查询比列表更高效!
valid_users = {'user1', 'user2', 'user3'}
if input_username in valid_users:
print("Access granted")
四、集合与其他容器的比较
特性 | 列表(List) | 元组(Tuple) | 集合(Set) | 字典(Dict) |
---|---|---|---|---|
有序性 | 是 | 是 | 否 | 是(3.7+) |
可变性 | 是 | 否 | 是 | 是 |
允许重复 | 是 | 是 | 否 | 键不可重复 |
查找效率 | O(n) | O(n) | O(1) | O(1) |
唐叔的建议:
- 需要保持元素顺序 → 用列表或元组
- 需要快速查找 → 用集合或字典
- 需要去重 → 用集合
- 需要键值对 → 用字典
- 数据不可变 → 用元组
五、进阶技巧
1. 集合推导式
squares = {x**2 for x in range(10)}
2. 不可变集合
frozen = frozenset([1, 2, 3]) # 不可变集合,可作为字典键
3. 性能优化示例
# 糟糕的做法(列表查找)
names_list = ['Alice', 'Bob', ...] # 假设有10000个元素
if 'Charlie' in names_list: # O(n)时间复杂度
...
# 优化的做法
names_set = set(names_list) # 转换为集合
if 'Charlie' in names_set: # O(1)时间复杂度
...
六、常见面试题解析
Q1:如何找出两个列表的不同元素?
list1 = [1, 2, 3, 4]
list2 = [3, 4, 5, 6]
# 对称差集解法
diff = set(list1) ^ set(list2) # {1, 2, 5, 6}
Q2:如何判断两个列表是否包含相同元素(不考虑顺序和重复)?
def is_same_elements(a, b):
return set(a) == set(b)
# 测试
print(is_same_elements([1,2,2,3], [3,2,1])) # True
七、总结
集合是Python中一个强大但常被忽视的数据结构。唐叔建议大家:
- 遇到需要去重的场景,第一时间想到集合
- 频繁查找时,考虑将列表转换为集合
- 合理利用集合运算简化代码逻辑
记住,选择合适的数据结构往往比优化算法更能提升性能。集合就是这样一个能让你代码既简洁又高效的利器。
往期文章推荐:
- 【Python入门】Python字符串操作大全:从基础到实战,轻松玩转字符串处理!
- 【Python入门】Python列表和字典:从入门到入土的黑魔法全解,效率直线拉升!
- 【Python入门】Python元组(Tuple):不可变序列的终极指南
更多内容可以关注 《唐叔学Python》专栏。
我是唐叔,咱们下期见!