Python集合(Set)详解:基础、方法与用法

Wayne
作者 Wayne ·

什么是 Python 集合(Set)?

Python 集合(set) 是由唯一元素组成的无序集合。集合是 Python 的内置数据类型之一,旨在存储多个不重复的元素。与列表或元组不同,集合不维护任何特定顺序,并会自动去重。

集合是可变的,这意味着你可以在创建后添加或删除元素。集合在并集、交集、差集等数学运算中非常有用。

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)