6.2 集合
Python中的集合(set)与数学中的集合概念类似,也是用于保存不重复的元素。它有可变集合(set)和不可变集合(frozenset)两种。其中,本节所要介绍的set集合是无序可变序列,而另一种在本书中不做介绍。在形式上,集合的所有元素都放在一对大括号“{}”中,两个相邻元素间使用逗号“,”分隔。集合最好的应用就是去重,因为集合中的每个元素都是唯一的。
说明
在数学中,集合的定义是把一些能够确定的不同的对象看成一个整体,而这个整体就是由这些对象的全体构成的集合。集合通常用大括号“{}”或者大写的拉丁字母表示。
集合最常用的操作就是创建集合,以及集合的添加、删除、交集、并集和差集等运算,下面分别进行介绍。
6.2.1 创建集合
在Python中提供了两种创建集合的方法,一种是直接使用“{}”创建;另一种是通过set()函数将列表、元组等可迭代对象转换为集合。笔者推荐使用第二种方法。下面分别进行介绍。
1.直接使用“{}”创建
在Python中,创建set集合也可以像列表、元组和字典一样,直接将集合赋值给变量,从而实现创建集合,即直接使用大括号“{}”创建。语法格式如下:
setname = {element 1,element 2,element 3,...,element n}
其中,setname表示集合的名称,可以是任何符合Python命名规则的标识符;element 1、element 2、element 3、element n表示集合中的元素,个数没有限制,并且只要是Python支持的数据类型就可以。
注意
在创建集合时,如果输入了重复的元素,Python会自动只保留一个。
例如,下面的每行代码都可以创建一个集合。
01 set1 = {'水瓶座','射手座','双鱼座','双子座'} 02 set2 = {3,1,4,1,5,9,2,6} 03 set3 = {'Python', 28, ('人生苦短', '我用Python')}
上面的代码将创建以下集合。
{'水瓶座', '双子座', '双鱼座', '射手座'} {1, 2, 3, 4, 5, 6, 9} {'Python', ('人生苦短', '我用Python'), 28}
说明
由于Python中的set集合是无序的,所以每次输出时元素的排列顺序可能与上面的不同,不必在意。
场景模拟:某大学的学生选课系统,可选语言有Python和C语言。现创建两个集合分别保存选择Python语言的学生名字和选择C语言的学生名字。
【例6.4】 创建保存学生选课信息的集合。(实例位置:资源包\TM\sl\06\04)
在IDLE中创建一个名称为section_create.py的文件,然后在该文件中定义两个包括4个元素的集合,再输出这两个集合,代码如下:
运行代码后,将显示如图6.7所示的结果。
图6.7 创建集合
2.使用set()函数创建
在Python中,可以使用set()函数将列表、元组等其他可迭代对象转换为集合。set()函数的语法格式如下:
setname = set(iteration)
参数说明如下:
setname:表示集合名称;
iteration:表示要转换为集合的可迭代对象,可以是列表、元组、range对象等。另外,也可以是字符串,如果是字符串,返回的集合将是包含全部不重复字符的集合。
例如,下面的每行代码都可以创建一个集合。
01 set1 = set("命运给予我们的不是失望之酒,而是机会之杯。") 02 set2 = set([1.414,1.732,3.14159,2.236]) 03 set3 = set(('人生苦短', '我用Python'))
上面的代码将创建以下集合。
{'不', '的', '望', '是', '给', ',', '我', '。', '酒', '会', '杯', '运', '们', '予', '而', '失', '机', '命', '之'} {1.414, 2.236, 3.14159, 1.732} {'人生苦短', '我用Python'}
从上面创建的集合结果中可以看出,在创建集合时,如果出现了重复元素,那么将只保留一个,例如在第一个集合中的“是”和“之”都只保留了一个。
注意
在创建空集合时,只能使用set()实现,而不能使用一对大括号“{}”实现,这是因为在Python中,直接使用一对大括号“{}”表示创建一个空字典。
下面将实例6.4修改为使用set()函数创建保存学生选课信息的集合。修改后的代码如下:
执行结果如图6.7所示。
说明
在Python中,创建集合时推荐采用set()函数实现。
6.2.2 向集合中添加和删除元素
集合是可变序列,所以在创建集合后,还可以对其添加或者删除元素。下面分别进行介绍。
1.向集合中添加元素
向集合中添加元素可以使用add()方法实现。它的语法格式如下:
setname.add(element)
其中,setname表示要添加元素的集合;element表示要添加的元素内容。这里只能使用字符串、数字及布尔类型的True或者False等,不能使用列表、元组等可迭代对象。
例如,定义一个保存明日科技零基础学系列图片名字的集合,然后向该集合中添加一个刚刚上市的图书名字,代码如下:
01 mr = set(['零基础学Java','零基础学Android','零基础学C语言','零基础学C#','零基础学PHP']) 02 mr.add('零基础学Python') # 添加一个元素 03 print(mr)
上面的代码运行后,将输出以下集合。
{'零基础学PHP', '零基础学Android', '零基础学C#', '零基础学C语言', '零基础学Python', '零基础学Java'}
2.从集合中删除元素
在Python中,可以使用del命令删除整个集合,也可以使用集合的pop()方法或者remove()方法删除一个元素,或者使用集合对象的clear()方法清空集合,即删除集合中的全部元素,使其变为空集合。
例如,下面的代码将分别实现从集合中删除指定元素、删除一个元素和清空集合。
上面的代码运行后,将输出以下内容。
使用remove()方法移除指定元素后: {'零基础学Android', '零基础学PHP', '零基础学C语言', '零基础学Java', '零 基础学C#'} 使用pop()方法移除一个元素后: {'零基础学PHP', '零基础学C语言', '零基础学Java', '零基础学C#'} 使用clear()方法清空集合后: set()
注意
使用集合的remove()方法时,如果指定的内容不存在,将抛出如图6.8所示的异常。所以在移除指定元素前,最好先判断其是否存在。要判断指定的内容是否存在,可以使用in关键字实现。例如,使用“'零语'in c”可以判断在c集合中是否存在“零语”。
图6.8 从集合中移除的元素不存在时抛出异常
场景模拟:仍然是某大学的学生选课系统,听说连小学生都学Python,“零语”同学决定放弃学习C语言,改为学习Python。
【例6.5】 学生更改所选课程。(实例位置:资源包\TM\sl\06\05)
在IDLE中创建一个名称为section_add.py的文件,然后在该文件中定义一个包括4个元素的集合,并且应用add()函数向该集合中添加一个元素,再定义一个包括4个元素的集合,并且应用remove()方法从该集合中删除指定的元素,最后输出这两个集合,代码如下:
运行代码后,将显示如图6.9所示的结果。
图6.9 向集合中添加和删除元素
6.2.3 集合的交集、并集和差集运算
集合最常用的操作就是进行交集、并集、差集和对称差集运算。进行交集运算时使用“&”符号;进行并集运算时使用“|”符号;进行差集运算时使用“-”符号,进行对称差集运算时使用“^”符号。下面通过一个具体的实例演示如何对集合进行交集、并集和差集运算。
场景模拟:仍然是某大学的学生选课系统,学生选课完毕后,老师要对选课结果进行统计。这时,需要知道哪些学生既选择了Python语言又选择了C语言,参与选课的全部学生,以及选择了Python语言但没有选择C语言的学生。
【例6.6】 对选课集合进行交集、并集和差集运算。(实例位置:资源包\TM\sl\06\06)
在IDLE中创建一个名称为section_operate.py的文件,然后在该文件中定义两个包括4个元素的集合,再根据需要对两个集合进行交集、并集和差集运算,并输出运算结果,代码如下:
在上面的代码中,为了获取既选择了Python语言又选择C语言的学生名字,对两个集合进行交集运算;为了获取参与选课的全部学生名字,对两个集合进行并集运算;为了获取选择了Python语言但没有选择C语言的学生名字,对两个集合进行差集运算。
运行代码后,将显示如图6.10所示的结果。
图6.10 对选课集合进行交集、并集和差集运算