Python的集合类型之set和frozenset详解

  • Post category:Python

Python 的集合类型之set和frozenset详解

什么是集合

集合是一种无序、不重复元素的容器。和列表、元组等Python容器不同,集合没有索引和值的关系。集合中的元素必须是不可变类型,例如字符串、数字、元组等。

Python中内置了两种类型的集合:set和frozenset。两者之间的差异在于frozenset的元素是不可变的,而set的元素可变。

set类型

创建set

通过花括号{}或set()函数可以创建一个set对象。创建set时,需要注意,如果直接使用花括号{}来创建一个空集合,实际上会创建一个空字典。

下面是创建set的几种方式:

# 使用{}创建set
empty_set = {}  # 创建一个空字典,而不是空集合
empty_set = set()  # 创建空集合
number_set = {1, 2, 3, 4, 5}  # 创建一个包含数字1到5的集合
string_set = {'apple', 'banana', 'orange'}  # 创建一个包含3个字符串的集合
mixed_set = {1, 'apple', True}  # 创建一个包含3种不同类型数据的集合

集合操作

添加元素

可以使用add()方法向set中添加单个元素,使用update()方法向set中添加多个元素,使用|运算符或者union()方法将两个set对象合并。

# 创建一个包含数字1到3的set对象
number_set = {1, 2, 3}

# 添加单个元素
number_set.add(4)

# 添加多个元素
number_set.update([5, 6, 7])

# 合并两个set对象
new_set = {5, 6, 7, 8, 9}
union_set = number_set.union(new_set)  # 使用union()方法合并
union_set = number_set | new_set  # 使用|运算符合并

删除元素

可以使用remove()方法删除set中的元素,如果删除的元素不存在会抛出KeyError异常。使用discard()方法也可以删除元素,但是不会抛出异常。

# 创建一个包含数字1到5的set对象
number_set = {1, 2, 3, 4, 5}

# 删除元素
number_set.remove(3)

# 通过discard()方法删除元素
number_set.discard(5)

判断元素是否在set中

可以使用in运算符判断元素是否在set中。

# 创建一个包含数字1到5的set对象
number_set = {1, 2, 3, 4, 5}

# 使用in运算符判断元素是否在set中
if 3 in number_set:
    print('3 in number_set')
else:
    print('3 not in number_set')

frozenset类型

在Python中,frozenset类是set类的不可变版本。frozenset类中的元素也必须是不可变类型,和set类一样,frozenset类也内置了很多集合操作方法。

创建frozenset

和set类似,可以使用花括号{}或frozenset()函数创建frozenset对象。

# 使用{}创建frozenset
empty_fset = frozenset()  # 创建空frozenset
number_fset = frozenset({1, 2, 3, 4, 5})  # 创建包含数字1到5的frozenset
string_fset = frozenset(('apple', 'banana', 'orange'))  # 创建包含3个字符串的frozenset

frozenset的操作

由于frozenset是不可变对象,因此不能添加、删除元素,也不能更新frozenset对象。但是,我们可以使用frozenset对象执行集合运算。

# 创建两个frozenset对象
fset1 = frozenset({1, 2, 3})
fset2 = frozenset({3, 4, 5})

# 计算交集
fset3 = fset1.intersection(fset2)

# 计算并集
fset4 = fset1.union(fset2)

示例说明

示例一

# 创建两个set对象
set1 = {1, 2, 3}
set2 = {3, 4, 5}

# 计算交集
intersection_set = set1 & set2
print(intersection_set)  # 输出 {3}

# 计算差集
difference_set = set1 - set2
print(difference_set)  # 输出 {1, 2}

# 计算并集
union_set = set1 | set2
print(union_set)  # 输出 {1, 2, 3, 4, 5}

在上面的示例中,我们创建了两个set对象set1和set2,然后分别计算了它们的交集、差集和并集。

示例二

# 创建一个set对象
set1 = {1, 2, 3, 4, 5}

# 向set中添加元素
set1.add(6)  # 添加单个元素
set1.update([7, 8, 9])  # 添加多个元素

# 删除元素
set1.remove(5)  # 删除单个元素
set1.discard(9)  # 删除单个元素

# 判断元素是否在set中
if 3 in set1:
    print('3 in set1')
else:
    print('3 not in set1')

在这个示例中,我们创建了一个set对象set1,并向其中添加了元素。然后,我们又使用remove()方法和discard()方法分别删除了两个元素。最后,我们使用in运算符判断元素3是否在set1中。