Python集合(Set)详解:基础、方法与用法
什么是 Python 集合(Set)?
Python 集合(set) 是由唯一元素组成的无序集合。集合是 Python 的内置数据类型之一,旨在存储多个不重复的元素。与列表或元组不同,集合不维护任何特定顺序,并会自动去重。
集合是可变的,这意味着你可以在创建后添加或删除元素。集合在并集、交集、差集等数学运算中非常有用。

Python 集合的关键特性
Python 集合具有以下特点:
- 元素唯一:集合会自动去重
- 无序性:元素没有固定的位置或索引
- 可变性:创建后仍可修改集合
- 可迭代:可以对集合进行遍历
- 无重复值:每个元素只出现一次
创建 Python 集合
在 Python 中可以通过多种方式创建集合:
使用花括号 {}
# 创建一个简单的集合
fruits = {'apple', 'banana', 'orange'}
print(fruits) # 输出:{'apple', 'banana', 'orange'}
# 自动去重
numbers = {1, 2, 2, 3, 3, 3}
print(numbers) # 输出:{1, 2, 3}
使用 set() 构造器
# 来自列表
my_set = set([1, 2, 3, 4])
# 来自字符串
char_set = set('hello')
print(char_set) # 输出:{'h', 'e', 'l', 'o'}
# 空集合(必须用 set(),不是 {})
empty_set = set()
常用集合操作
添加元素
使用 add() 方法插入单个元素:
fruits = {'apple', 'banana'}
fruits.add('orange')
print(fruits) # 输出:{'apple', 'banana', 'orange'}
使用 update() 添加多个元素:
fruits = {'apple', 'banana'}
fruits.update(['orange', 'grape', 'mango'])
print(fruits) # 输出:{'apple', 'banana', 'orange', 'grape', 'mango'}
删除元素
集合提供多种删除方式:
fruits = {'apple', 'banana', 'orange'}
# remove() - 若元素不存在会抛出错误
fruits.remove('banana')
# discard() - 若元素不存在也不会抛错
fruits.discard('grape')
# pop() - 随机移除并返回一个元素
fruit = fruits.pop()
# clear() - 移除所有元素
fruits.clear()
集合的数学运算
Python 集合支持强大的数学运算:
并集(Union)
合并多个集合中的元素:
set1 = {1, 2, 3}
set2 = {3, 4, 5}
# 使用 | 运算符
result = set1 | set2 # {1, 2, 3, 4, 5}
# 使用 union() 方法
result = set1.union(set2)
交集(Intersection)
查找公共元素:
set1 = {1, 2, 3}
set2 = {2, 3, 4}
# 使用 & 运算符
result = set1 & set2 # {2, 3}
# 使用 intersection() 方法
result = set1.intersection(set2)
差集(Difference)
查找只在一个集合中、而不在另一个集合中的元素:
set1 = {1, 2, 3}
set2 = {2, 3, 4}
# 使用 - 运算符
result = set1 - set2 # {1}
# 使用 difference() 方法
result = set1.difference(set2)
对称差(Symmetric Difference)
查找只在其中一个集合中(不在交集中)的元素:
set1 = {1, 2, 3}
set2 = {2, 3, 4}
# 使用 ^ 运算符
result = set1 ^ set2 # {1, 4}
# 使用 symmetric_difference() 方法
result = set1.symmetric_difference(set2)
集合的典型使用场景
去重
集合非常适合用于去除重复值:
numbers = [1, 2, 2, 3, 3, 3, 4, 5, 5]
unique_numbers = list(set(numbers))
print(unique_numbers) # [1, 2, 3, 4, 5]
成员测试
集合提供快速的成员检查:
valid_users = {'alice', 'bob', 'charlie'}
if 'alice' in valid_users:
print("User is valid")
查找共同元素
快速找出两个集合(或可迭代对象)之间的共同元素:
list1 = ['apple', 'banana', 'orange']
list2 = ['banana', 'grape', 'orange']
common = set(list1) & set(list2)
print(common) # {'banana', 'orange'}
集合推导式
类似列表推导式,你可以使用集合推导式创建集合:
# 平方数
squares = {x**2 for x in range(10)}
print(squares) # {0, 1, 4, 9, 16, 25, 36, 49, 64, 81}
# 偶数
evens = {x for x in range(20) if x % 2 == 0}
冻结集合(frozenset)
Python 还提供 frozenset,即集合的不可变版本:
# 创建冻结集合
fs = frozenset([1, 2, 3, 4])
# 可用作字典键
my_dict = {fs: 'value'}
# 不能被修改
# fs.add(5) # 将会抛出 AttributeError
常见问题(FAQ)
问:Python 中的 set 与 list 有何区别?
答:set 是无序且元素唯一的集合;list 是有序且允许重复的序列。集合在成员测试方面更快,并会自动去重;列表保持插入顺序并支持索引访问。
问:Python 的集合可以包含重复值吗?
答:不可以。Python 集合会自动去重。如果你用包含重复值的数据创建集合,最终只会保留唯一元素。例如,{1, 2, 2, 3} 会变为 {1, 2, 3}。
问:如何访问集合中的元素?
答:集合是无序的,不能通过索引访问。你可以通过 for 循环遍历集合,或使用 in 运算符进行成员检查。
问:Python 的集合是可变的还是不可变的?
答:普通集合是可变的,可以在创建后添加或移除元素;另外还有 frozenset,它是集合的不可变版本。
问:集合能包含哪些类型的元素?
答:集合可以包含任意可哈希(不可变)的对象,如数字、字符串、元组;不能包含列表、字典或其他可变对象(如普通 set)。
问:什么时候应该使用 set 而不是 list?
答:当你需要以下场景时使用 set:
- 自动去重
- 进行数学运算(并集、交集等)
- 快速进行成员测试
- 不需要维护顺序
当你需要有序数据或允许重复元素时,使用 list。
问:如何将集合转换为列表?
答:使用 list() 构造器:my_list = list(my_set)。注意,由于集合无序,转换后的顺序不可预测。
问:可以对集合进行排序吗?
答:集合本身不能排序(无序)。你可以先转换为列表再排序:sorted_list = sorted(my_set)。
