#Python 的集合(set)
是一个基本的数学模型,指若干不同对象形成的总体。类似于只有键(key)的字典,简单来说,集合内的元素不会重复。
字典的字面量使用花括号({}
)包裹一组值表示,例如:
fruits:set[str] = {'Apple', 'Orange', 'Strawberry', 'Banana', 'Pineapple'}
类型标注 set[str]
,表示类型是 元素类型为 str
的集合。
#空集
创建空集需要使用 set()
,而不能使用 {}
,因为后者表示空字典。
#通过 list 或 tuple 创建集合
可以通过列表或元组来创建集合,源列表或元组中重复的值会被过滤,从而实现去重:
numbers_list:list[int] = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8, 9, 7, 9, 3, 2, 3, 8, 4, 6]
numbers_set:set[int] = set(numbers_list)
print(numbers_list)
print(numbers_set)
numbers_list = list(numbers_set)
print(numbers_list)
#不可变的集合
set
是 可变类型,即可以修改其内部元素的值,不可变 的集合使用 frozenset
类型存储。
frozenset
没有字面量的写法,只能通过 frozenset 函数创建。
例如:
fruits:frozenset[str] = frozenset({'Apple', 'Orange', 'Strawberry', 'Banana', 'Pineapple'})
#判断元素是否存在
和字典类似,使用 in
来判断元素是否在集合中:
fruits:set[str] = {'Apple', 'Orange', 'Strawberry', 'Banana', 'Pineapple'}
print('Strawberry' in fruits)
print('Strawberry' not in fruits)
#添加元素
使用 add
方法添加元素:
fruits:set[str] = {'Apple', 'Orange', 'Strawberry', 'Banana', 'Pineapple'}
fruits.add('Grape')
print(fruits)
#删除元素
可以使用 remove
或 discard
方法删除元素:
remove
- 删除指定元素,元素不存在时产生错误discard
- 删除指定元素,元素不存在时不产生错误
fruits:set[str] = {'Apple', 'Orange', 'Strawberry', 'Banana', 'Pineapple'}
fruits.remove('Apple') # 删除 'Apple'
fruits.discard('Banana') # 删除 'Banana'
print(fruits)
#清空集合
可以使用 clear
方法清空集合:
fruits:set[str] = {'Apple', 'Orange', 'Strawberry', 'Banana', 'Pineapple'}
fruits.clear()
print(fruits)
#合并集合
可以使用 update
方法合并集合:
fruits:set[str] = {'Apple', 'Orange', 'Strawberry'}
fruits.update({'Banana', 'Pineapple'})
print(fruits)
#交集
通过 intersection
方法或 &
运算符,可以求集合的交集(包含两个集合中相同的元素):
- 这两种方式都不改变原集合,而是返回一个新的集合。
- 使用
intersection_update
方法,则修改原集合为交集。
fruits:set[str] = {'Apple', 'Orange', 'Strawberry', 'Tomato', 'Cucumber'}
vegetables:set[str] = {'Cabbage', 'Tomato', 'Cucumber', 'Spinach'}
print(fruits.intersection(vegetables))
print(fruits & vegetables)
#并集
通过 union
方法或 |
运算符,可以求集合的并集(包含两个集合的元素组):
- 这两种方式都不改变原集合,而是返回一个新的集合。
- 使用
update
方法,则修改原集合为并集。
fruits:set[str] = {'Apple', 'Orange', 'Strawberry', 'Tomato', 'Cucumber'}
vegetables:set[str] = {'Cabbage', 'Tomato', 'Cucumber', 'Spinach'}
print(fruits.union(vegetables))
print(fruits | vegetables)
#差集
通过 difference
方法或 |
运算符,可以求集合的差集(包含只在第一个集合中存在的元素):
- 这两种方式都不改变原集合,而是返回一个新的集合。
- 使用
difference_update
方法,则修改原集合为差集。
fruits:set[str] = {'Apple', 'Orange', 'Strawberry', 'Tomato', 'Cucumber'}
vegetables:set[str] = {'Cabbage', 'Tomato', 'Cucumber', 'Spinach'}
print(fruits.difference(vegetables))
print(fruits - vegetables)
#对称差集
通过 symmetric_difference
方法=可以求集合的对称差集(包含两个集合中不同的元素):
- 这两种方式都不改变原集合,而是返回一个新的集合。
- 使用
symmetric_difference_update
方法,则修改原集合为对称差集。
fruits:set[str] = {'Apple', 'Orange', 'Strawberry', 'Tomato', 'Cucumber'}
vegetables:set[str] = {'Cabbage', 'Tomato', 'Cucumber', 'Spinach'}
print(fruits.symmetric_difference(vegetables))
#子集和超集
如果集合 A 的所有元素都被 集合 B 包含,则 A 是 B 的子集,B 是 A 的超集。
在此基础上,如果 A 和 B 不相等,则称 A 是 B 的真子集,B 是 A 的真超集。
Python 通过比较运算符 <
、<=
、>
、>=
判断集合关系:
关系 | 说明 |
---|---|
A <= B | A 是 B 的子集 |
A < B | A 是 B 的真子集 |
A >= B | A 是 B 的超集 |
A > B | A 是 B 的真超集 |