1.2.2 基础数据类型组合使用
Python语言中有三种组合数据类型在程序设计时会经常被用到,分别是集合类型、序列类型和映射类型。集合类型是一个元素集合,元素之间无序,相同元素在集合中唯一存在。序列类型是一个元素向量,元素之间存在先后关系,通过序列号访问,元素之间不排他。序列类型的典型代表是字符串类型和列表类型(详见1.2.1.2节)。映射类型是键-值对的组合,每一个元素是一个键-值对,表示为key:value。映射类型的典型代表是字典类型(详见1.2.1.2节)。
集合类型是一个具体的数据类型,序列类型和映射类型是一类数据类型的总称。
1.2.2.1 集合类型
Python 语言中集合和其他语言的集合类似,表示一个无序的不重复元素集,即不可以使用下标索引的方式读取数据,集合中不存在重复的数据。Python 的集合可支持数学运算,如并集、交集、差集和对称差集等。
Python可以通过两种方式创建集合:使用大括号“{}”包含元素或者使用set()方法创建集合。需要注意的是,如果只是创建一个空集,则必须使用set()方法,不能使用“{}”包含元素。因为字典的表示方法也是用“{}”包含元素的,所以使用“{}”包含元素创建的字典被认为创建了一个空字典。
集合的两种创建方式为:
集合创建的示例运行结果如图1.70所示。
图1.70 集合创建的示例运行结果
在上面的示例中,“{}”是集合的表示符,如果用“{}”来定义一个集合,那么该集合会自动进行去重处理,处理后的元素次序会发生变动;如果使用 set()方法来定义一个集合,则set()方法会先将其中的目标对象自动分解为基本元素,然后使用“{}”重新定义一个包含所有基本元素的集合,最后对集合中的元素进行去重处理。
定义集合时需要注意以下几点:
(1)在使用“{}”或者set()方法定义一个集合时,该集合中不会包含重复的元素,并且元素的次序是乱序。
(2)在使用set()方法定义集合时,操作的对象不能是数字,因为set()方法在分解数字时会引发异常。
(3)尽管集合的表示符“{}”与字典的表示符“{}”相同,但其内部元素的结构有较大的差异,集合的元素是用逗号分隔的,字典采用的是键-值对;集合可以进行数学运算,字典只能进行数据读取。
集合操作示例如下:
集合操作的示例运行结果如图1.71所示。
图1.71 集合操作的示例运行结果
此外,与列表支持推导式类似,集合同样支持推导式,例如:
集合推导式的运行结果如图1.72所示。
图1.72 集合推导式的运行结果
1.2.2.2 集合的基本操作
1)添加元素
通过add()方法可在集合中添加元素,用法如下:
其中,s为需要添加元素的集合;x为待添加的元素。在使用add()方法将元素x添加到集合s中时,需要注意的是,若集合s中已经存在元素x,则会因为集合的自动去重功能而使s.add(x)运行后无实质效果。例如:
通过add()方法添加元素的示例运行结果如图1.73所示。
图1.73 通过add()方法添加元素的示例运行结果
此外,使用update()函数也可以为集合添加新元素,用法如下:
其中,s为需要添加元素的集合;x为待添加的元素,可以是列表、元组和字典等,若x中包含多个数据项,则可以用逗号分隔这些数据项。例如:
通过update()方法添加元素的示例运行结果如图1.74所示。
图1.74 通过update()方法添加元素的示例运行结果
由于集合中的数据都是基本数据类型,如数字、布尔及字符串等,所以在向集合中添加列表、集合等时,Python 解释器会将其中的数据项提取出来,在进行去重处理后合并到集合phone_set中。
2)删除元素
通过remove()方法可以删除集合中的元素,用法如下:
其中,s为需删除元素的集合;x为要删除的元素。使用remove()方法虽然可以将元素x从集合s中删除,但如果待删除的元素不在集合中,则会引发异常。例如:
通过remove()方法删除元素的示例运行结果如图1.75所示。
图1.75 通过remove()方法删除元素的示例运行结果
从图1.75所示的运行结果来看,两句“print(phone_set)”均被正常运行,表示若集合中存在被删除的元素,通过 remove()方法可以删除这些元素;最后一句在删除不存在的元素时引发了异常。在通过 remove()方法删除集合中的元素前必须确定待删除的元素是存在的,这可以通过in语句进行判定,如“if“XiaoMi”in phone_set:phone_set.remove(“XiaoMi”)”。
如果不希望在删除元素的过程中产生异常,则可以通过discard()方法来删除集合中的元素。使用 discard()方法时,即使待删除的元素不存在也不会引发异常。discard()方法的用法如下:
其中,s为需要删除元素的集合;x为待删除的元素。例如:
通过discard()方法删除元素的示例运行结果如图1.76所示。
此外,通过读取-删除的方式也可以将元素从集合中删除,读取-删除的方式与“数据结构”课程中的链表操作类似,用法如下:
图1.76 通过discard()方法删除元素的示例运行结果
其中,s为需要删除元素的集合,pop()方法会将s中的第1个元素弹出。例如:
通过pop()方法删除元素的示例运行结果如图1.77所示。
图1.77 通过pop()方法删除元素的示例运行结果
由图1.77所示的结果可以看出,当定义一个集合时,集合中的元素是乱序排序的。也就是说,通过set()方法或者“{}”定义集合时,集合中的元素排序是随机的,如上面示例中的phone_set的第1个元素是“HuaWei”,Python解释器在生成变量phone_set时对其中的元素进行了乱序排序,第1个元素变成了“OPPO”,所以通过pop()方法删除了集合中的第1个元素“OPPO”。
3)计算集合元素的个数
通过len()方法可计算集合元素的个数,用法如下:
其中,s为需要计算元素个数的集合。例如:
通过len()方法计算集合元素个数的示例运行结果如图1.78所示。
图1.78 通过len()方法计算集合元素个数的示例运行结果
4)清空集合
通过clear()方法可清空集合中的元素,用法如下:
其中,s为需要清空元素的集合。例如:
通过clear()方法清空集合元素的示例运行结果如图1.79所示。
图1.79 通过clear()方法清空集合元素的示例运行结果
通过 clear()方法清空集合中的元素后,集合会变为空集。如果此时输出集合的内容,则显示的结果是“set()”。
5)判断元素是否在集合中
通过成员运算符in可判断元素是否在集合中,用法如下:
其中,s为目标集合;x为任意元素;in为成员运算符。在Python 语言中,成员运算符用于判断指定序列中是否包含某个值,如果包含则返回True,否则返回False。例如:
通过成员运算符in判断元素是否在集合中的示例运行结果如图1.80所示。
在上面的示例中,“my_phone in phone_set”是一个判断运算,判断结果是True或False。
集合内置的方法如表1.4所示。
图1.80 通过成员运算符in判断元素是否在集合中的示例运行结果
表1.4 集合内置的方法