Python 教程 - 集合

集合(set)可以看作是"只有键,没有值"的字典。在一个集合中,所有的键都是唯一的,因为集合不会包含重复的数据。这个特性使得集合经常用来去除重复的元素,或者判断元素之间是否有交集、并集或差集等关联性。

创建集合

集合由数字、字符串或布尔值组成,同一个集合中的元素可以是不同的类型。创建集合有两种方式:

set()

使用 set() 可以创建空集合,或者将列表、元组、字符串或字典转换成集合。使用方法为 set(要变成集合的元素)

如果创建时出现重复的元素,只会保留一个。如果是字典,只会保留键。如果是布尔值,True 等同于 1,False 等同于 0。

dart 复制代码
a = set()
b = set([1,2,3,4,5,1,2,3,4,5])
c = set({'x':1,'y':2,'z':3})
d = set('hello')
print(a)   # set()
print(b)   # {1, 2, 3, 4, 5}  只留下不重复的部分
print(c)   # {'x', 'y', 'z'}  如果是字典,只保留键
print(d)   # {'l', 'o', 'h', 'e'}  只留下不重复的部分

大括号 {}

如果不是空集合,可以使用 {元素} 创建集合(单纯写大括号,会变成"空字典")。

css 复制代码
a = {0,1,2,3,'a','b',False}
print(a)  # {0, 1, 2, 3, 'a', 'b'}  False 等同于 0,所以只保留 0

添加元素

使用 集合.add(元素) 可以将某个元素加入到集合中。下面的代码会将 xy 两个字符串加入到 a 集合。

csharp 复制代码
a = {0,1,2,3,4,5}
a.add('x')
a.add('y')
print(a)   # {0, 1, 2, 3, 4, 5, 'x', 'y'}

移除元素

有两种方法可以移除集合里的某个元素:

remove()

使用 集合.remove(元素) 可以将指定的元素移除,但如果该元素不存在,就会执行错误。

lua 复制代码
a = {0,1,2,3,'x','y','z'}
a.remove('x')
print(a)   # {0, 1, 2, 3, 'y', 'z'}

discard()

如果不希望在移除元素时发生执行错误的情况,可以使用 集合.discard(元素) 移除指定元素。

bash 复制代码
a = {0,1,2,3,'x','y','z'}
a.discard('x')
a.discard('a')   # 不会发生错误
print(a)         # {0, 1, 2, 3, 'y', 'z'}

集合运算

交集、并集、差集、对称差集

集合有四种运算类型,分别是"交集、并集、差集、对称差集"。通过下图可以了解四种运算类型。

使用集合运算有两种方法,一种是使用特定的方法,另一种是使用"符号"(集合运算符)。

集合 方法 运算符
交集 a.intersection(b) a&b
并集 a.union(b) a|b
差集 a.difference(b) a-b
对称差集 a.symmetricdifference(b) a^b

下面的代码对 ab 进行集合运算。

bash 复制代码
a = {1,2,3,4,5}
b = {3,4,5,6,7}

# 交集
print(a.intersection(b))   # {3, 4, 5}
print(a&b)                 # {3, 4, 5}
# 并集
print(a.union(b))          # {1, 2, 3, 4, 5, 6, 7}
print(a|b)                 # {1, 2, 3, 4, 5, 6, 7}
# 差集
print(a.difference(b))     # {1, 2}
print(a-b)                 # {1, 2}
# 对称差集
print(a.symmetricdifference(b))  # {1, 2, 6, 7}
print(a^b)                        # {1, 2, 6, 7}

子集合、超集合

假设有 A、B 两个集合,超集合和子集合的关系可以参考下图:

集合 说明
超集合 A 完全包含 B,A 和 B 所包含的元素可能完全相同
真超集合 A 完全包含 B,且具有 B 没有的的元素
子集合 B 完全被 A 包含,A 和 B 所包含的元素可能完全相同
真子集合 B 完全被 A 包含,且 A 具有 B 没有的的元素

下面的代码中有四个集合,使用「大于、小于、等于」可以表示彼此的关系,从打印出的结果可以看到各个集合之间的关系。

css 复制代码
a = {1,2,3,4,5,6,7}
b = {3,4,5,6,7}
c = {1,2,3,4,5,6,7}
d = {6,7,8,9}

print(a<=a)   # True 自己是自己的子集合
print(b<=a)   # True b 是 a 的子集合
print(b<a)    # True b 也是 a 的真子集合 ( 因为没有等于,完全包含 )
print(c<=a)   # True c 是 a 的子集合
print(a<=c)   # True a 也是 c 的子集合
print(d<a)    # False d 和 a 没有子集合或超集合关系

此外,使用「b.issubset(a)」方法可以检查 b 是否为 a 的子集合、「a.issuperset(b)」方法可以检查 a 是否为 b 的超集合。

css 复制代码
a = {1,2,3,4,5,6,7}
b = {3,4,5,6,7}
c = {1,2,3,4,5,6,7}
d = {6,7,8,9}

print(b.issubset(a))     # True b 是 a 的子集合
print(a.issuperset(b))   # True a 是 b 的超集合
print(c.issubset(a))     # True c 是 a 的子集合
print(d.issubset(a))     # Fasle d 不是 a 的子集合

获取集合长度

使用 len(集合) 可以返回某个集合的长度(有多少个元素)。

ini 复制代码
a = {1,2,3,4,5,6,7}
print(len(a))   # 7

检查元素是否存在

使用 元素 in 集合 可以检查集合中是否存在某个元素,如果存在则返回 True,不存在则返回 False(使用 元素 not in 集合 可以判断不存在)。

bash 复制代码
a = {'a','b','c','d',1,2,3}
print('b' in a)    # True
print(2 in a)      # True
print(99 in a)     # False
相关推荐
JUNAI_Strive_ving5 分钟前
番茄小说逆向爬取
javascript·python
彤银浦6 分钟前
python学习记录7
python·学习
简单.is.good27 分钟前
【测试】接口测试与接口自动化
开发语言·python
Yvemil71 小时前
MQ 架构设计原理与消息中间件详解(二)
开发语言·后端·ruby
2401_854391081 小时前
Spring Boot大学生就业招聘系统的开发与部署
java·spring boot·后端
Envyᥫᩣ1 小时前
Python中的自然语言处理:从基础到高级
python·自然语言处理·easyui
哪 吒1 小时前
华为OD机试 - 几何平均值最大子数(Python/JS/C/C++ 2024 E卷 200分)
javascript·python·华为od
我是陈泽1 小时前
一行 Python 代码能实现什么丧心病狂的功能?圣诞树源代码
开发语言·python·程序员·编程·python教程·python学习·python教学
hakesashou1 小时前
python全栈开发是什么?
python
虽千万人 吾往矣1 小时前
golang gorm
开发语言·数据库·后端·tcp/ip·golang