Python 集合 (Sets)
1. 集合的定义 (Definition)
集合是 Python 中的一种数据结构,用于存储唯一的、无序的元素集合。集合的主要特点是:
- 元素不重复(唯一性)
- 元素无序(不支持索引访问)
- 元素必须是可哈希的(不可变类型,如数字、字符串、元组)
- 集合本身是可变的(可以添加或删除元素)
- 使用花括号
{}表示(空集合除外)
集合特别适合用于成员测试、消除重复项和计算数学集合运算(如交集、并集、差集等)。
2. 创建集合 (Creating Sets)
2.1 使用花括号创建
# 创建非空集合
fruits = {'apple', 'banana', 'orange', 'apple'} # 重复元素会自动去除
print(fruits) # 输出: {'orange', 'banana', 'apple'} (顺序可能不同)
# 注意:创建空集合不能使用 {},因为这会创建空字典
# 错误方式:empty_set = {} # 这实际上创建了一个字典
2.2 使用 set() 构造函数创建
# 创建空集合
empty_set = set()
# 从其他可迭代对象创建集合
set_from_list = set([1, 2, 3, 2, 1]) # 从列表创建
print(set_from_list) # 输出: {1, 2, 3}
set_from_string = set('hello') # 从字符串创建
print(set_from_string) # 输出: {'h', 'e', 'l', 'o'} (注意 'l' 只出现一次)
2.3 使用集合推导式创建
# 创建一个包含偶数的集合
even_numbers = {x for x in range(10) if x % 2 == 0}
print(even_numbers) # 输出: {0, 2, 4, 6, 8}
3. 集合的基本操作 (Basic Operations)
3.1 查询元素 (Checking Elements)
fruits = {'apple', 'banana', 'orange'}
# 检查元素是否存在于集合中
print('apple' in fruits) # 输出: True
print('grape' in fruits) # 输出: False
3.2 添加元素 (Adding Elements)
fruits = {'apple', 'banana'}
# 添加单个元素
fruits.add('orange')
print(fruits) # 输出: {'apple', 'banana', 'orange'}
# 添加多个元素
fruits.update(['grape', 'mango', 'apple']) # 添加可迭代对象中的所有元素,重复的会被忽略
print(fruits) # 输出: {'apple', 'banana', 'orange', 'grape', 'mango'}
3.3 删除元素 (Removing Elements)
fruits = {'apple', 'banana', 'orange', 'grape', 'mango'}
# 使用 remove() 方法删除元素 (如果元素不存在,会引发 KeyError)
fruits.remove('apple')
print(fruits) # 输出: {'banana', 'orange', 'grape', 'mango'}
# 使用 discard() 方法删除元素 (如果元素不存在,不会引发错误)
fruits.discard('banana')
fruits.discard('pear') # 不会报错,即使 'pear' 不在集合中
print(fruits) # 输出: {'orange', 'grape', 'mango'}
# 使用 pop() 方法随机删除并返回一个元素
fruit = fruits.pop() # 由于集合是无序的,pop 会随机移除一个元素
print(fruit) # 输出: 被移除的元素
print(fruits) # 输出: 剩余的元素
# 使用 clear() 方法清空集合
fruits.clear()
print(fruits) # 输出: set()
4. 集合的常用方法 (Common Set Methods)
4.1 基本方法
# 创建两个集合
set1 = {1, 2, 3, 4, 5}
set2 = {4, 5, 6, 7, 8}
# copy() - 复制集合
set1_copy = set1.copy()
print(set1_copy) # 输出: {1, 2, 3, 4, 5}
# len() - 获取集合长度
print(len(set1)) # 输出: 5
# max() 和 min() - 获取集合中的最大和最小值
print(max(set1)) # 输出: 5
print(min(set1)) # 输出: 1
4.2 集合运算方法
有集合的方法和运算符两种方式,其中方法可以使用可迭代对象(列表、元组、集合、字典、字符串),而运算符只可以使用集合。
set1 = {1, 2, 3, 4, 5}
set2 = {4, 5, 6, 7, 8}
# union() - 并集:返回包含两个集合所有元素的新集合
union_set = set1.union(set2) # 或使用 set1 | set2
print(union_set) # 输出: {1, 2, 3, 4, 5, 6, 7, 8}
# intersection() - 交集:返回包含两个集合共有元素的新集合
intersection_set = set1.intersection(set2) # 或使用 set1 & set2
print(intersection_set) # 输出: {4, 5}
# difference() - 差集:返回包含在第一个集合但不在第二个集合中的元素的新集合
difference_set = set1.difference(set2) # 或使用 set1 - set2
print(difference_set) # 输出: {1, 2, 3}
# symmetric_difference() - 对称差集:返回包含在一个集合中但不在两个集合交集中的元素的新集合
symmetric_difference_set = set1.symmetric_difference(set2) # 或使用 set1 ^ set2
print(symmetric_difference_set) # 输出: {1, 2, 3, 6, 7, 8}
-
>(真子集):判断一个集合是否是另一个集合的真子集。s1 = {1, 2, 3} s2 = {1, 2, 3, 4, 5} print(s1 < s2) # 输出:True,因为 s1 是 s2 的真子集 -
<(真超集):判断一个集合是否是另一个集合的真超集。print(s2 > s1) # 输出:True,因为 s2 是 s1 的真超集 -
==(相等):判断两个集合是否相等。s3 = {1, 2, 3} print(s1 == s3) # 输出:True,因为 s1 和 s3 的元素完全相同 -
<=(子集):判断一个集合是否是另一个集合的子集。print(s1 <= s2) # 输出:True,因为 s1 是 s2 的子集 -
>=(超集):判断一个集合是否是另一个集合的超集。print(s2 >= s1) # 输出:True,因为 s2 是 s1 的超集 -
|(并集):返回两个集合的并集。s1 = {1, 2, 3} s2 = {3, 4, 5} print(s1 | s2) # 输出:{1, 2, 3, 4, 5} -
&(交集):返回两个集合的交集。print(s1 & s2) # 输出:{3} -
-(差集):返回两个集合的差集。print(s1 - s2) # 输出:{1, 2} print(s2 - s1) # 输出:{4, 5} -
^(对称差集):返回两个集合的对称差集,即两个集合中不共有的元素。print(s1 ^ s2) # 输出:{1, 2, 4, 5}
s1 = {1, 2, 3}
s2 = {3, 4, 5}
s3 = {1, 2, 3}
# 集合关系判断
print(s1 < s2) # True,s1 是 s2 的真子集
print(s2 > s1) # True,s2 是 s1 的真超集
print(s1 == s3) # True,s1 和 s3 相等
print(s1 <= s2) # True,s1 是 s2 的子集
print(s2 >= s1) # True,s2 是 s1 的超集
# 集合运算
print(s1 | s2) # {1, 2, 3, 4, 5},并集
print(s1 & s2) # {3},交集
print(s1 - s2) # {1, 2},差集
print(s2 - s1) # {4, 5},差集
print(s1 ^ s2) # {1, 2, 4, 5},对称差集
4.3 就地修改集合的方法
set1 = {1, 2, 3, 4, 5}
set2 = {4, 5, 6, 7, 8}
# update() - 并集更新:将另一个集合的元素添加到当前集合中
set1.update(set2) # 或使用 set1 |= set2
print(set1) # 输出: {1, 2, 3, 4, 5, 6, 7, 8}
# 重新初始化集合
set1 = {1, 2, 3, 4, 5}
set2 = {4, 5, 6, 7, 8}
# intersection_update() - 交集更新:保留同时存在于两个集合中的元素
set1.intersection_update(set2) # 或使用 set1 &= set2
print(set1) # 输出: {4, 5}
# 重新初始化集合
set1 = {1, 2, 3, 4, 5}
set2 = {4, 5, 6, 7, 8}
# difference_update() - 差集更新:移除当前集合中存在于另一个集合中的元素
set1.difference_update(set2) # 或使用 set1 -= set2
print(set1) # 输出: {1, 2, 3}
# 重新初始化集合
set1 = {1, 2, 3, 4, 5}
set2 = {4, 5, 6, 7, 8}
# symmetric_difference_update() - 对称差集更新:仅保留存在于一个集合中而不存在于两个集合交集中的元素
set1.symmetric_difference_update(set2) # 或使用 set1 ^= set2
print(set1) # 输出: {1, 2, 3, 6, 7, 8}
4.4 集合关系判断方法
set1 = {1, 2, 3, 4, 5}
set2 = {1, 2, 3}
set3 = {6, 7, 8}
# issubset() - 判断一个集合是否为另一个集合的子集
print(set2.issubset(set1)) # 输出: True (set2 是 set1 的子集)
print(set2 <= set1) # 输出: True (使用运算符)
# issuperset() - 判断一个集合是否为另一个集合的超集
print(set1.issuperset(set2)) # 输出: True (set1 是 set2 的超集)
print(set1 >= set2) # 输出: True (使用运算符)
# isdisjoint() - 判断两个集合是否没有交集
print(set1.isdisjoint(set3)) # 输出: True (set1 和 set3 没有交集)
print(set1.isdisjoint(set2)) # 输出: False (set1 和 set2 有交集)
5. 集合的高级用法 (Advanced Usage)
5.1 不可变集合 (frozenset)
# 创建不可变集合
frozen = frozenset([1, 2, 3, 4])
print(frozen) # 输出: frozenset({1, 2, 3, 4})
# frozen.add(5) # 错误! frozenset 是不可变的,不支持添加元素
# 可以用作字典的键
dict_with_set_keys = {frozen: "This is a frozen set as key"}
print(dict_with_set_keys[frozen]) # 输出: This is a frozen set as key
5.2 使用集合去重
# 使用集合去除列表中的重复元素
numbers = [1, 2, 2, 3, 3, 3, 4, 5, 5]
unique_numbers = list(set(numbers))
print(unique_numbers) # 输出: [1, 2, 3, 4, 5] (顺序可能不同)
# 保持原列表顺序的去重方法
def remove_duplicates(items):
seen = set()
result = []
for item in items:
if item not in seen:
seen.add(item)
result.append(item)
return result
ordered_unique = remove_duplicates(numbers)
print(ordered_unique) # 输出: [1, 2, 3, 4, 5] (保留原始顺序)
5.3 集合推导式高级用法
# 多条件集合推导式
numbers = {x for x in range(100) if x % 2 == 0 if x % 5 == 0}
print(numbers) # 输出: {0, 10, 20, 30, 40, 50, 60, 70, 80, 90}
# 嵌套集合推导式
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flattened = {x for row in matrix for x in row}
print(flattened) # 输出: {1, 2, 3, 4, 5, 6, 7, 8, 9}
5.4 集合与其他数据结构的转换
# 列表转集合
my_list = [1, 2, 2, 3, 4]
my_set = set(my_list)
print(my_set) # 输出: {1, 2, 3, 4}
# 集合转列表
my_list_again = list(my_set)
print(my_list_again) # 输出: [1, 2, 3, 4] (顺序可能不同)
# 元组转集合
my_tuple = (1, 2, 2, 3, 4)
my_set = set(my_tuple)
print(my_set) # 输出: {1, 2, 3, 4}
# 集合转元组
my_tuple_again = tuple(my_set)
print(my_tuple_again) # 输出: (1, 2, 3, 4) (顺序可能不同)
# 字符串转集合
my_string = "hello"
my_set = set(my_string)
print(my_set) # 输出: {'h', 'e', 'l', 'o'}
# 集合转字符串
my_string_again = ''.join(my_set) # 注意:顺序不确定
print(my_string_again) # 输出: 例如 "helo" (顺序可能不同)
6. 总结 (Summary)
Python 集合是一种高效的数据结构,特别适用于以下场景:
- 需要确保元素唯一性
- 频繁进行成员检查操作
- 需要进行数学集合运算(并集、交集、差集等)
- 需要消除重复元素
集合的主要特性:
- 无序性 - 元素没有特定顺序
- 唯一性 - 不允许重复元素
- 可变性 - 可以添加和删除元素(除了 frozenset)
- 只能包含可哈希(不可变)的元素
掌握 Python 集合的使用能够提高代码效率,尤其是在处理数据去重、元素归属检查和集合运算等场景时。
1093

被折叠的 条评论
为什么被折叠?



