![Python+Excel办公自动化一本通](https://wfqqreader-1252317822.image.myqcloud.com/cover/221/40795221/b_40795221.jpg)
5.2 集合
集合与元组和列表实际上也是接近的,只是集合强调的是元素的无序性和唯一性,也就是说,集合中的元素是没有固定排序的,并且一个集合中不存在两个相同的元素。
5.2.1 创建集合
创建集合使用的是花括号“{}”或Python的内置函数set,下面通过如代码清单5-6来说明。
代码清单5-6:创建集合
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/097-4.jpg?sign=1739285196-LiTbI6VRX3e2HIjBOUqVbMC6hPm1myHi-0-b7ff77eacdf575322afbde591e406953)
显然,创建集合还是比较简单的,但是如果创建的是一个空集合,那么只能使用set函数,而不能使用花括号,如下所示:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/098-1.jpg?sign=1739285196-ag7IAeFqsYrzIqvpFdgwiL9QwZo2BymP-0-ad28512f8bcbf6d31c427c248f7be2e8)
运行上述代码得到的输出结果如下:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/098-2.jpg?sign=1739285196-sjKS8TFlkVgKgTInamP5dUgIChb919GB-0-762f534084e2e15cad45765e41ca8562)
由此可见,这里的set2并不是一个集合,而是后面要介绍的字典,所以创建空集合只能使用set函数,而不能使用花括号。
对于集合来说,元素是不能重复的,如果在创建时存在相同的元素,那么集合会自动合并,以保证每个元素都不同,代码清单5-7可以验证这一点。
代码清单5-7:带有重复元素创建集合
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/098-3.jpg?sign=1739285196-rQmwSIDtmovKZPfwwkASAo0XFN2mYY3g-0-03a629f1f295d18fdae24f5d0fe154f8)
上述代码中的“python”、3和9都是重复的元素,在创建的时候集合会将它们合并为一个,因此运行这段程序的输出结果如下:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/098-4.jpg?sign=1739285196-tueM4TSicd9qpRa0Qanj4oKQElPwrF6Z-0-ff864acaba2a9d021338dfd3ad3b98ef)
由此可见,集合会合并相同的元素,以保证每个元素都是不重复的。
5.2.2 新增元素
在集合中新增元素可以使用add函数和update函数。其中,使用add函数可以新增一个元素,而使用update函数可以将元组、集合、列表等可迭代的数据类型的元素添加到集合中。
add函数的用法如下:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/098-5.jpg?sign=1739285196-PJpVeLsy8DA6rpdgAQLQc61BOoudzPp4-0-5bd63003f4d760887818252eff2caca2)
显然,add函数允许一个一个地新增元素。如果需要添加多个元素则可以考虑使用update函数,如下所示:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/098-6.jpg?sign=1739285196-tCeokwnuqaDeF9qXGwnXKqevGFyJhL8f-0-b6cbb26540d38d93729a37a44a59eee7)
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/099-1.jpg?sign=1739285196-jo0nkEbJ88NCMTW09oh9CgUcraF2Jj5b-0-ef6822d2b92f74109bda67388b58172a)
运行上述代码得到的输出结果如下:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/099-2.jpg?sign=1739285196-QWcD3nhM661rwqMbWrfR5bGyBqk6v0RK-0-802616f0e6230fc8b5a671d404a7e37f)
每次运行的输出结果都可能出现不同,这是因为集合中的元素是无序的,并不能保证元素的顺序。
注意 当update函数的参数为字符串类型时
上面没有在update函数的参数中使用字符串,因为使用字符串需要特别注意,所以这里单独介绍。update函数的参数使用字符串的代码如下:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/099-3.jpg?sign=1739285196-Fp5eSBvtvnh3KlxsiLiBRYUr58FTKjmz-0-252e1cb07141cf4bc3478dca3e785bcb)
运行上述代码可能会(这是因为集合中的元素是无序的)得到如下输出结果:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/099-4.jpg?sign=1739285196-W34TDDQOwPNjcVrLWMff2Ur6QGvNc9Tl-0-fdf872fe822f641cb93c4efd62afda74)
由此可见,update函数会将字符串中的一个个字符作为元素存放到集合中。所以,需要给集合添加元素在遇到字符串时,如果是一个字符串那么最好使用add函数,如果是多个字符串则可以使用列表、集合和元组等,如下所示:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/099-5.jpg?sign=1739285196-aFgSxvj6yQP2CxbaBEvjjBqLqxljUzNZ-0-baed5dd16fc4ec071d6a225d939addaf)
5.2.3 删除元素
在集合中存在3个删除元素的函数,分别是remove、discard和pop,下面展开介绍。
remove函数代表删除一个元素,参数是元素的值,需要注意的是,当无法找到对应的元素时,运行时会发生异常,如下所示:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/099-6.jpg?sign=1739285196-SFHjtx4ZBrZv2XBWAdtWcoTWMsARxiem-0-29120afa4fc2b2a688e44f4d41287f13)
需要注意的是,代码①处删除的5并不在集合中,所以运行到这行时就会发生异常,为了保证不发生异常,就需要先行验证元素是否在集合中,如下所示:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/100-1.jpg?sign=1739285196-4eXLiTF8UlpHPvN3ZQTwtqxAAR4Csnje-0-ea66c8b9ab52cc539c3e449e33ec72ed)
但是这样会显得很麻烦,为此集合中还提供了discard函数。discard函数的含义也是删除集合中的一个元素,但是如果找不到要删除的元素,那么就什么都不做,这样就不会发生异常,如下所示:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/100-2.jpg?sign=1739285196-tYx8e16SXaCSMx1L5g3hwnXQKE4RtB5q-0-89b38cd5a1e37004aeb28bd499acc663)
上述代码使用了discard函数,这样即使运行到代码①处时,集合也不会因为找不到元素而发生异常。
pop函数则是从集合中随机弹出一个元素,之所以是随机的,是因为集合是无序的。如果集合已经为空,那么pop函数在执行时也会发生异常。下面通过代码清单5-8来说明。
代码清单5-8:使用集合中的pop函数
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/100-3.jpg?sign=1739285196-H1UNXGwOilZcmsPjZUaeMna2DUVHDMDa-0-02c579659dcf8699880cfc20bf7a8c75)
需要注意代码①处,由于set2是一个空集合,因此执行这行代码时会发生异常。
此外,集合中还提供了清空的功能,clear函数可以清空集合中所有的元素,如下所示:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/100-4.jpg?sign=1739285196-Ejp7l5wYrKiJEjMz5KNzTJ548SwY9uhZ-0-267b4b73679402075c619cd1c05c04e3)
运行上述代码得到的输出结果如下:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/100-5.jpg?sign=1739285196-KfHYZrVstCjaCGx6aPTQpO0CrAcNBBs5-0-5d742bcb2833a4ad0b2cdc479a0896bd)
5.2.4 判断元素是否在集合中
判断元素是否在集合中使用in关键字,这和列表、元组等数据类型也是接近的,如下所示:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/101-1.jpg?sign=1739285196-WTG2FNZaUm317659JaTlS0VMUROjOz8v-0-5b78916eba9e7535ffbf2bed53814687)
运行上述代码得到的输出结果如下:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/101-2.jpg?sign=1739285196-JBwz6T33EnSmnu0xtRL7Wp1c8YJcAeNe-0-5787d8281f7c7870749d5caf910ff901)
5.2.5 遍历集合
对于集合来说,它的元素是无序的,所以遍历集合时,元素的顺序也是随机的。遍历集合的方法很多,下面通过代码清单5-9来说明。
代码清单5-9:遍历集合中的元素
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/101-3.jpg?sign=1739285196-ZSGnOJEFLwDfsldjXoFFTgsCAFQj46Yo-0-5a3fea11b65523c0567b55d708b97383)
代码①处使用for循环遍历集合,代码②处通过迭代来进行循环,代码③处则是通过while循环遍历集合。运行上述代码可能会输出如下结果:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/102-1.jpg?sign=1739285196-aXAcaY783QBfOcSIpGjIUeOtuPEHxvx8-0-5983da573fde0e854b78873deb29c7b1)
注意 时刻需要注意的是集合中的元素是无序的
如果多次运行代码清单5-9,读者就会发现运行结果可能会有所不同,这是因为集合中的元素是无序的,Python并不保证集合元素的顺序。如果需要有序的元素,那么可以使用列表,只是列表并不保证元素的唯一性。
5.2.6 关于集合的函数
关于集合的函数,首先是Python内置的4个函数,如表5-2所示。
表5-2 Python内置的4个函数
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/102-2.jpg?sign=1739285196-JioLUDqxYj38MPNjG7bY53RWmULJxsac-0-fe2da7c96cc8e59b22d15f61de4418ab)
下面运用表5-2中的4个函数,如代码清单5-10所示。
代码清单5-10:Python关于集合的4个内置函数
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/102-3.jpg?sign=1739285196-p4AZy4Zpau8HxsoaOITIR8G9U84CDBAj-0-5b0d85dd15c80274593843cc0b025361)
运行上述代码得到的输出结果如下:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/102-4.jpg?sign=1739285196-5BjBIuYgEWFZdEKXwTZGdvqqpKzxAGY3-0-6c91e5a4773844e9c5f7e860ea6181e4)
除此之外,集合也有自己的函数,主要是集合交、补、并、差等运算,下面通过表5-3进行简要的说明。
表5-3 集合的相关函数
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/102-5.jpg?sign=1739285196-4h197ErEskvR1TegaFxMCKa3mESqnKM2-0-867ab526c2a9fdf9c44e712daedac37b)
在表5-3中,加粗的函数在前面已经讨论过,所以本节不再重复介绍。其他的函数则是读者需要关注的内容,主要是集合的交、补、并、差运算,下面通过举例进行介绍。
copy函数用于复制当前的集合,测试代码如下:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/103-2.jpg?sign=1739285196-z8JAroCpXnFwrjZBO2OELHxm51J2YhIN-0-f232948efbae009c3fb552cca8e4bacd)
运行上述代码得到的输出结果如下:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/103-3.jpg?sign=1739285196-SkvJvN5206Il167RZ3oWiiJpomHd69eX-0-4380599496eea6dbf246d06f5570d8bb)
虽然复制集合成功,但两个集合的地址不尽相同,这说明复制会创建新的集合。
差集主要使用函数difference和difference_update,它们的逻辑是相同的,只是difference_update函数会更新当前集合中的元素,而difference函数则不会,测试代码如下:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/103-4.jpg?sign=1739285196-ou9vt0tW6uvfchO6PsJLToy2f2dDVzml-0-af7728776c5bdd6fe3e9c10e86b736d6)
difference函数和difference_update函数的区别在于是否会修改当前集合中的元素,这是需要读者在实践中注意的。运行上述代码得到的输出结果如下:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/104-1.jpg?sign=1739285196-hIfcUrJxSfF5O6VqbK53IDslcC6rMfEa-0-bb26a5f7cb0210fe9122b4d8dbe930f8)
交集分为3个函数:isdisjoint、intersection和intersection_update。isdisjoint函数用于判断两个集合是否存在相交的元素;intersection函数用于求两个集合的交集,但是并不改变当前集合;intersection_update函数用于求两个集合的交集并修改当前集合。测试代码如下:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/104-2.jpg?sign=1739285196-K5SADSHL15vw4nPss9kRvNY6XJYYmIc0-0-ff63add4b3cae064513b58013bc821d9)
运行上述代码得到的输出结果如下:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/104-3.jpg?sign=1739285196-NCjV24nI3hTFhQ3sAukSAjhu5vzWYDYY-0-fe3535e5bf4f4d10c03b974019ec755f)
接下来求集合中不重复的元素,这里涉及两个函数:symmetric_difference和symmetric_difference_update。其中,symmetric_difference函数会返回两个集合中不重复的元素,而symmetric_difference_update函数则用于求两个集合中不重复的元素,并赋值给当前集合。下面通过代码进行说明:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/104-4.jpg?sign=1739285196-ccpuzH9mnIOfcXjO5zhAOOqTDt554IFS-0-d0fb47b13fb99df9cbe3070a2dc6750e)
运行上述代码得到的输出结果如下:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/104-5.jpg?sign=1739285196-DxOJASHFtJZ4574zQRm98LMA5pyGNgsX-0-63e6c05b51c7cb9b0f043ea3b99855ba)
下面进行父子集合的判断,这里涉及两个函数:issubset和issuperset。issubset函数用于判断当前集合是否为参数集合的子集,而issuperset函数则用于判断当前集合是否为参数集合的父集。下面通过代码进行说明:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/105-1.jpg?sign=1739285196-VpCjsWmKuM1g1mmd6PKAGDO8mMjSaLsm-0-6fa211c8a230659c7eec47596db255db)
运行上述代码得到的输出结果如下:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/105-2.jpg?sign=1739285196-f62cXtE0HubW8Y8453wXjEW7piCEurWF-0-34242327f084a08654a8e155e609f781)
最后介绍并集,它只有一个union函数,下面举例说明:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/105-3.jpg?sign=1739285196-sq7Yp4ipmbrmlSOmeYOQTs2IsREC1JPq-0-5332966789b00fe4cb9db81b173bc588)
运行上述代码得到的输出结果如下:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/105-4.jpg?sign=1739285196-th8InLgFEuvs4yKjlgmvidG1A2tBjqAE-0-1ae3228b8903d386b4fa9d811e927d65)