
4.5 集合
Python中的集合(Set)与数学中的集合概念类似,也是用于保存不重复的元素,有可变集合(Set)和不可变集合(Frozenset)两种。在形式上,集合的所有元素都放在一对大括号中,两个相邻元素间使用逗号“,”分隔。集合最好的应用就是去重,因为集合中的每个元素都是唯一的。
集合(Set)是不重复元素的无序集,它兼具了列表和字典的一些性质。
集合有类似字典的特点:用花括号“{}”来定义,其元素是非序列类型的数据,也就是没有顺序,并且集合中的元素不可重复,也必须是不可变对象,类似于字典中的键。集合的内部结构与字典很相似,区别是“只有键没有值”。
另一方面,集合也具有一些列表的特点:拥有一系列元素,并且可以修改。由于集合是无序的,不记录元素位置或者插入点,因此不支持索引、切片或其他类序列(Sequence-Like)的操作。
在数学中,集合的定义是把一些能够确定的不同的对象看成一个整体,而这个整体就是由这些对象的全体构成的集合。集合通常用大括号“{}”或者大写的拉丁字母表示。集合最常用的操作就是创建集合,以及集合的增加、删除、交集、并集和差集等运算。
4.5.1 集合的创建
在Python中提供了两种创建集合的方法,一种是直接使用“{}”创建;另一种是通过set函数将列表、元组等可迭代对象转换为集合。一般推荐使用第二种方法。
1.直接使用{}创建集合
在Python中,创建set集合也可以像列表、元组和字典一样,直接将集合赋值给变量,从而实现创建集合,即直接使用大括号“{}”创建。
语法格式如下。

参数说明:
● setname:表示集合的名称,可以是任何符合Python命名规则的标识符。
● element1、element2、element3、elementn:表示集合中的元素,个数没有限制,并且只要是Python支持的数据类型就可以。
在创建集合时,如果输入了重复的元素,Python会自动只保留一个。
【例4-50】 定义并显示集合。

运行结果:

注意:由于集合内部存储的元素是无序的,因此输出的顺序和原列表的顺序有可能是不同的。
2.使用set函数创建集合
在Python中,可以使用set函数将列表、元组等其他可迭代对象转换为集合。
set函数的语法格式如下。

参数说明:
● setname:表示集合名称。
● iteration:表示要转换为集合的可迭代对象,可以是列表、元组、range对象等。另外,也可以是字符串,如果是字符串,返回的集合将是包含全部不重复字符的集合。
【例4-51】 使用set函数将字符串转换为集合。

运行结果:

在创建集合时,如果出现了重复元素,那么将只保留一个。
在创建空集合时,只能使用set函数实现,而不能使用一对大括号“{}”实现,这是因为在Python中,直接使用一对大括号表示创建一个空字典。
4.5.2 集合元素的常见操作(增加、删除、查找)
集合是可变序列,所以在创建集合后,还可以对其添加或者删除元素。
1.向集合中添加元素
(1)add()方法
向集合中添加元素可以使用add()方法实现。它的语法格式如下。

其中,setname表示要添加元素的集合;element表示要添加的元素内容。这里只能使用字符串、数字及布尔类型的True或者False等,不能使用列表、元组等可迭代对象。
(2)update()方法
update()方法是向集合追加的数据是序列,比如列表,元组,字典等,否则会报错。
【例4-52】 update()方法应用示例。

运行结果:

2.从集合中删除元素
在Python中,可以使用del命令删除整个集合,也可以使用集合的discard()方法、pop()方法或者remove()方法删除一个元素,或者使用集合对象的clear()方法清空集合,即删除集合中的全部元素,使其变为空集合。discard()方法删除集合中的指定数据,如果数据不存在也不会报错。
【例4-53】 向集合中添加、删除、清空元素,并显示。


运行结果:

使用集合的remove()方法时,如果指定的内容不存在,将抛出异常。所以在移除指定元素前,最好先判断其是否存在。要判断指定的内容是否存在,可以使用in关键字实现。pop()方法是随机删除集合中的某个数据,并返回这个数据。
3.查找元素
在集合中用in判断数据是否在集合序列;not in判断数据是否不在集合序列。
【例4-54】 判断元素是否在集合中存在的示例。

运行结果:

4.5.3 集合的交集、并集和差集数学运算
集合最常用的操作就是进行交集、并集、差集和对称差集运算。进行交集运算时使用“&”符号;进行并集运算时使用“|”符号;进行差集运算时使用“-”符号。
【例4-55】 对集合进行交集、并集和差集运算。

运行结果:

集合是可修改的数据类型,但集合中的元素必须是不可修改的。换句话说,集合中的元素只能是数值、字符串、元组之类。由于集合是可修改的,因此集合中的元素不能是集合。但是Python另外提供了frozenset函数来创建不可修改的集合,这种集合可作为字典的key,也可以作为其他集合的元素。