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中。