Python 集合之 set 和 frozenset 的使用详解
在 Python 中,集合(set)和冻结集合(frozenset)是两个非常常用的数据类型,他们可以用于去重、Membership testing(成员测试)、交集、并集、差集等操作,非常适合在处理数据集、统计、去重等场合使用。
set 基本操作
创建 set
创建 set 的方式有两种:
- 通过
{}
标记创建(推荐) - 通过内置的 set() 函数创建
示例代码如下:
# 创建 set 的方式
set1 = {1, 2, 3, 4}
set2 = set([1, 2, 3, 4])
print(set1)
print(set2)
输出结果
{1, 2, 3, 4}
{1, 2, 3, 4}
添加元素
set 中添加一个元素的方式是使用 add
方法,添加多个元素的方式是使用 update
方法。
示例代码如下:
# 添加元素
set1.add(5) # 添加单个元素
set1.update([6, 7, 8]) # 添加多个元素
print(set1)
输出结果:
{1, 2, 3, 4, 5, 6, 7, 8}
删除元素
set 中删除单个元素使用的是 remove
方法,当元素不存在时,会触发 KeyError 错误;删除元素时不需要考虑顺序。
示例代码如下:
# 删除元素
set1.remove(8)
print(set1)
输出结果如下:
{1, 2, 3, 4, 5, 6, 7}
判断元素是否在集合内
使用 in
或者 not in
即可判断。
示例代码如下:
# 判断元素是否存在
print(1 in set1)
print(9 not in set1)
输出结果如下:
True
True
求交集
使用 &
或者 intersection
方法求交集。
示例代码如下:
setA = {1, 2, 3, 4}
setB = {3, 4, 5, 6}
# 求交集
print(setA & setB) # {3, 4}
print(setA.intersection(setB)) # {3, 4}
求并集
使用 |
或者 union
方法求并集。
示例代码如下:
setA = {1, 2, 3, 4}
setB = {3, 4, 5, 6}
# 求并集
print(setA | setB) # {1, 2, 3, 4, 5, 6}
print(setA.union(setB)) # {1, 2, 3, 4, 5, 6}
求差集
使用 -
或者 difference
方法求差集。
示例代码如下:
setA = {1, 2, 3, 4}
setB = {3, 4, 5, 6}
# 求差集
print(setA - setB) # {1, 2}
print(setA.difference(setB)) # {1, 2}
frozenset 的基本操作
frozenset 是一种不可变类型的集合,与 set 不同,frozenset 不能进行修改,但仍然可以进行一些集合运算比如并集和交集。
创建 frozenset
使用内置的 frozenset()
函数创建一个 frozenset。
示例代码如下:
frozenset1 = frozenset([1, 2, 3, 4])
print(frozenset1)
输出结果如下:
frozenset({1, 2, 3, 4})
求交集
使用 &
或者 intersection
方法求交集。
示例代码如下:
frozensetA = frozenset([1, 2, 3, 4])
frozensetB = frozenset([3, 4, 5, 6])
# 求交集
print(frozensetA & frozensetB) # frozenset({3, 4})
print(frozensetA.intersection(frozensetB)) # frozenset({3, 4})
求并集
使用 |
或者 union
方法求并集。
示例代码如下:
frozensetA = frozenset([1, 2, 3, 4])
frozensetB = frozenset([3, 4, 5, 6])
# 求并集
print(frozensetA | frozensetB) # frozenset({1, 2, 3, 4, 5, 6})
print(frozensetA.union(frozensetB)) # frozenset({1, 2, 3, 4, 5, 6})
示例说明
示例一:计算两个字符串中非重复字符
如何计算两个字符串之间的非重复字符呢?
通过集合的交集运算,可以计算两个集合中的公共元素(唯一不重复的字符)。
代码实现如下:
# 计算两个字符串中的非重复字符
stringA = 'abcd'
stringB = 'cdef'
setA = set(stringA)
setB = set(stringB)
result = setA.intersection(setB)
print(result) # {'c', 'd'}
解释:集合 setA
包含字符 {'a', 'b', 'c', 'd'}
,集合 setB
包含字符 {'c', 'd', 'e', 'f'}
,两个集合的交集运算结果为 {'c', 'd'}
,即为两个字符串之间的非重复字符。
示例二:对列表进行去重
如何对列表进行去重呢?
使用集合(set)的性质可以快速对列表进行去重。具体步骤是先使用列表创建集合,再把集合转换为列表即可。
代码实现如下:
# 对列表进行去重
listA = [1, 2, 3, 3, 4, 5, 5, 6, 6]
setA = set(listA)
result = list(setA)
print(result) # [1, 2, 3, 4, 5, 6]
解释:列表 listA
包含重复元素 [1, 2, 3, 3, 4, 5, 5, 6, 6]
,使用 set
函数可以创建一个非重复的集合,即 {1, 2, 3, 4, 5, 6}
,然后使用 list()
函数转换集合为列表,去掉重复元素 [1, 2, 3, 4, 5, 6]
。