Python集合之set和frozenset的使用详解

  • Post category:Python

Python 集合之 set 和 frozenset 的使用详解

在 Python 中,集合(set)和冻结集合(frozenset)是两个非常常用的数据类型,他们可以用于去重、Membership testing(成员测试)、交集、并集、差集等操作,非常适合在处理数据集、统计、去重等场合使用。

set 基本操作

创建 set

创建 set 的方式有两种:

  1. 通过 {}标记创建(推荐)
  2. 通过内置的 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]