国际访客建议访问 Primers 编程伙伴 国际版站点 > Python 教程 > 集合 set 以获得更好的体验。

# Python 的集合(set)

是一个基本的数学模型,指若干不同对象形成的总体。类似于只有键(key)的字典,简单来说,集合内的元素不会重复。

字典的字面量使用花括号({})包裹一组值表示,例如:

fruits:set[str] = {'Apple', 'Orange', 'Strawberry', 'Banana', 'Pineapple'}
digraph HashTable {
  node [shape=record, fontname="Helvetica"];

  fruits [label="fruits", shape=ellipse];

  // 桶的结构
  bucket1 [label="Apple"];
  bucket2 [label="Orange"];
  bucket3 [label="Strawberry"];
  bucket4 [label="Banana"];
  bucket5 [label="Pineapple"];

  // 指向桶
  fruits -> bucket1 [label="Apple"];
  fruits -> bucket2 [label="Orange"];
  fruits -> bucket3 [label="Strawberry"];
  fruits -> bucket4 [label="Banana"];
  fruits -> bucket5 [label="Pineapple"];
}

类型标注 set[str],表示类型是 元素类型为 str 的集合

参考 PEP 585,此类型标注需要 Python 版本 \(\geq\) 3.9,之前的版本需要引用 typing 模块。

# 空集

创建空集需要使用 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)

# 判断元素是否存在

和字典类似,使用 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)

# 删除元素

可以使用 removediscard 方法删除元素:

  • 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 的真超集
本文 更新于: 2025-06-19 01:15:24 创建于: 2025-06-19 01:15:24