![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=1739628796-VCh3AVsYMc13bBxEL4xOIlcJSZYA7CzH-0-8248bde8cbcd3b1b6cd73198fd835e99)
显然,创建集合还是比较简单的,但是如果创建的是一个空集合,那么只能使用set函数,而不能使用花括号,如下所示:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/098-1.jpg?sign=1739628796-ZIaU4D9TnnruLiKhzvefUsCKTySvSra1-0-a66453ef5151ccfcab70f9e4cf243f2d)
运行上述代码得到的输出结果如下:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/098-2.jpg?sign=1739628796-BiWsJLzOi8hSU3dRVsnrrCxZuuDZmhHB-0-840a0043ae44dc25fa0effea49ed980e)
由此可见,这里的set2并不是一个集合,而是后面要介绍的字典,所以创建空集合只能使用set函数,而不能使用花括号。
对于集合来说,元素是不能重复的,如果在创建时存在相同的元素,那么集合会自动合并,以保证每个元素都不同,代码清单5-7可以验证这一点。
代码清单5-7:带有重复元素创建集合
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/098-3.jpg?sign=1739628796-QJJCUUD9eBLiZtIwyGAFXFLzWxAfLTqN-0-b8aebaeb41b25985dd6a92e7c5132cab)
上述代码中的“python”、3和9都是重复的元素,在创建的时候集合会将它们合并为一个,因此运行这段程序的输出结果如下:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/098-4.jpg?sign=1739628796-oSX3xwgpCsFqnRPyRVLmhX9DdNiRkw14-0-c00025a3186e63c35ecc8029c102e499)
由此可见,集合会合并相同的元素,以保证每个元素都是不重复的。
5.2.2 新增元素
在集合中新增元素可以使用add函数和update函数。其中,使用add函数可以新增一个元素,而使用update函数可以将元组、集合、列表等可迭代的数据类型的元素添加到集合中。
add函数的用法如下:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/098-5.jpg?sign=1739628796-zJaKbrIAgU1Xmvu71U7UZLLvuDEgWCsY-0-e065c8391de6597ce413f46192c04d76)
显然,add函数允许一个一个地新增元素。如果需要添加多个元素则可以考虑使用update函数,如下所示:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/098-6.jpg?sign=1739628796-hAA6xH8alQgeAM0S4a0k0unKtfCekylB-0-76eadedff5037fee5b49a46ba2e10424)
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/099-1.jpg?sign=1739628796-YrPOtkCkWIaxe88w0PGPGVXyPF5nvbh9-0-afa5d37b9a7c7217f8b300e2498ed308)
运行上述代码得到的输出结果如下:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/099-2.jpg?sign=1739628796-G8xjjwQzvu8MFJf07qvWwIwyKPgMscoA-0-fcd21237ea9cc37681d63a992f99eced)
每次运行的输出结果都可能出现不同,这是因为集合中的元素是无序的,并不能保证元素的顺序。
注意 当update函数的参数为字符串类型时
上面没有在update函数的参数中使用字符串,因为使用字符串需要特别注意,所以这里单独介绍。update函数的参数使用字符串的代码如下:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/099-3.jpg?sign=1739628796-CD5XS9a0xHdnuODjmpNiXin2Uve2xnrn-0-2a0d5e5ab8db36f7cb1d33b472d63fa7)
运行上述代码可能会(这是因为集合中的元素是无序的)得到如下输出结果:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/099-4.jpg?sign=1739628796-MwCHA3rbCYs9JNxWAzSIHafzr0Y0SDXV-0-37d17fb32b3c55bbc759980c17fd6e08)
由此可见,update函数会将字符串中的一个个字符作为元素存放到集合中。所以,需要给集合添加元素在遇到字符串时,如果是一个字符串那么最好使用add函数,如果是多个字符串则可以使用列表、集合和元组等,如下所示:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/099-5.jpg?sign=1739628796-gc3QO7tOcYmcZo5y0RIlMgoZO6rIdTG6-0-17b48b0699b7534a23b318d31b0ec36d)
5.2.3 删除元素
在集合中存在3个删除元素的函数,分别是remove、discard和pop,下面展开介绍。
remove函数代表删除一个元素,参数是元素的值,需要注意的是,当无法找到对应的元素时,运行时会发生异常,如下所示:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/099-6.jpg?sign=1739628796-mRxbfckgJ1zw1mj4b4Pg4IpnUJTj4Yx2-0-57f7f945502814e3e92ef8cfbddd8f91)
需要注意的是,代码①处删除的5并不在集合中,所以运行到这行时就会发生异常,为了保证不发生异常,就需要先行验证元素是否在集合中,如下所示:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/100-1.jpg?sign=1739628796-ookZHkuQeG6EzjxYWa60ZltctPhXGAY2-0-eb532632c08728b85601f1c06d40d674)
但是这样会显得很麻烦,为此集合中还提供了discard函数。discard函数的含义也是删除集合中的一个元素,但是如果找不到要删除的元素,那么就什么都不做,这样就不会发生异常,如下所示:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/100-2.jpg?sign=1739628796-TMe9sIMqw8RekHGVs653CRznc3aazdQa-0-79fcb3ab15bc0f9195397cf2a786edf4)
上述代码使用了discard函数,这样即使运行到代码①处时,集合也不会因为找不到元素而发生异常。
pop函数则是从集合中随机弹出一个元素,之所以是随机的,是因为集合是无序的。如果集合已经为空,那么pop函数在执行时也会发生异常。下面通过代码清单5-8来说明。
代码清单5-8:使用集合中的pop函数
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/100-3.jpg?sign=1739628796-zi5WMtyeRZBu10dISQ6G0IDpKihplmpn-0-30bb5af42bdb403507788c0b9908d553)
需要注意代码①处,由于set2是一个空集合,因此执行这行代码时会发生异常。
此外,集合中还提供了清空的功能,clear函数可以清空集合中所有的元素,如下所示:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/100-4.jpg?sign=1739628796-9WzwsshgxIhUT8pxWUbnjLYBvTLE1LXe-0-bb640ccd79c12152d9a884eff4b17a09)
运行上述代码得到的输出结果如下:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/100-5.jpg?sign=1739628796-2XB3PpCvtCVv0zwCzdzSzUTWPkaOjNVu-0-d38b7124bbadd9d71930e6c3ae539ac8)
5.2.4 判断元素是否在集合中
判断元素是否在集合中使用in关键字,这和列表、元组等数据类型也是接近的,如下所示:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/101-1.jpg?sign=1739628796-5BTK7GceVbNJecGkv95ubvPFB8I3EHUl-0-3e58a030de06c9541d9c9a3c2cb99ce5)
运行上述代码得到的输出结果如下:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/101-2.jpg?sign=1739628796-hMAcPup6ceXxnPQNmRl0ptyUv35sOfit-0-a16c1e5e22afdc26777cd2b9f6105fac)
5.2.5 遍历集合
对于集合来说,它的元素是无序的,所以遍历集合时,元素的顺序也是随机的。遍历集合的方法很多,下面通过代码清单5-9来说明。
代码清单5-9:遍历集合中的元素
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/101-3.jpg?sign=1739628796-ELyNPMV6I0lKjgWoPb7fA59l8y8JMXKF-0-51bdeba69521918528d5bae3e4da0f0c)
代码①处使用for循环遍历集合,代码②处通过迭代来进行循环,代码③处则是通过while循环遍历集合。运行上述代码可能会输出如下结果:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/102-1.jpg?sign=1739628796-nTL1sxsXLsnb5sPiNjGj7hzDlhB7GbOr-0-661f252f16354afbb46feda29011966b)
注意 时刻需要注意的是集合中的元素是无序的
如果多次运行代码清单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=1739628796-0oRmGQdGg4usIgQAhtWUEI4avVmxeJls-0-9c7841e5e559697ce7cfa5f39921d84e)
下面运用表5-2中的4个函数,如代码清单5-10所示。
代码清单5-10:Python关于集合的4个内置函数
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/102-3.jpg?sign=1739628796-nvBt1o4IybIkAZapgN7Cw6iMFc0bSbWs-0-82e03f9f0224975b1e328a290c1a7ab2)
运行上述代码得到的输出结果如下:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/102-4.jpg?sign=1739628796-wKB2GFX2K814vNQqho0aNNeQjLgymVKp-0-7959f59e58b93b879733e49191d7d08e)
除此之外,集合也有自己的函数,主要是集合交、补、并、差等运算,下面通过表5-3进行简要的说明。
表5-3 集合的相关函数
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/102-5.jpg?sign=1739628796-1bdpJnmagOAomZIlZDtwg1f13XQ6Ow5K-0-018da75aabb380a6799a36db258c0a77)
在表5-3中,加粗的函数在前面已经讨论过,所以本节不再重复介绍。其他的函数则是读者需要关注的内容,主要是集合的交、补、并、差运算,下面通过举例进行介绍。
copy函数用于复制当前的集合,测试代码如下:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/103-2.jpg?sign=1739628796-P9N8NL0mbKePDqwK4UsqEu8HMpGXN3aa-0-271c68ecec1818e60f621522e01cc361)
运行上述代码得到的输出结果如下:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/103-3.jpg?sign=1739628796-QQ4j1DpON8NUDPPJBZmU5HlrvoKSh7qM-0-8c4d50d711231c4dd09dccf6df3816af)
虽然复制集合成功,但两个集合的地址不尽相同,这说明复制会创建新的集合。
差集主要使用函数difference和difference_update,它们的逻辑是相同的,只是difference_update函数会更新当前集合中的元素,而difference函数则不会,测试代码如下:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/103-4.jpg?sign=1739628796-HogNB4QuLbTXc1rv20iNigMRXYNOVLHN-0-5cc4da25f7d11817e5b473bd4aabd589)
difference函数和difference_update函数的区别在于是否会修改当前集合中的元素,这是需要读者在实践中注意的。运行上述代码得到的输出结果如下:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/104-1.jpg?sign=1739628796-pTedl6hkZRH1BK0k4k5vFfGfKbb7koTN-0-b1fcd47461cd7cb339ccd6c57679fc94)
交集分为3个函数:isdisjoint、intersection和intersection_update。isdisjoint函数用于判断两个集合是否存在相交的元素;intersection函数用于求两个集合的交集,但是并不改变当前集合;intersection_update函数用于求两个集合的交集并修改当前集合。测试代码如下:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/104-2.jpg?sign=1739628796-TVa104xvpgoPmhfPzqpTyimn1IDPlf3k-0-3b8dc6ddc9dfbc183f1a0eef3a353b3e)
运行上述代码得到的输出结果如下:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/104-3.jpg?sign=1739628796-3mv3coFuHFzX5DpKCIFLaliamMbVUman-0-c2503eac9836b61fb81ca2db569aac1c)
接下来求集合中不重复的元素,这里涉及两个函数:symmetric_difference和symmetric_difference_update。其中,symmetric_difference函数会返回两个集合中不重复的元素,而symmetric_difference_update函数则用于求两个集合中不重复的元素,并赋值给当前集合。下面通过代码进行说明:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/104-4.jpg?sign=1739628796-64bLOyB8qEIaxPhKnmiqpgxobQXtcueu-0-b6e727b1cddba1c0abf477e90380386f)
运行上述代码得到的输出结果如下:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/104-5.jpg?sign=1739628796-DYUeUtKIwxuOrQv6NhNkUTf7wiynI3qN-0-081f512eb72e4a14ebca3de56ea93e73)
下面进行父子集合的判断,这里涉及两个函数:issubset和issuperset。issubset函数用于判断当前集合是否为参数集合的子集,而issuperset函数则用于判断当前集合是否为参数集合的父集。下面通过代码进行说明:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/105-1.jpg?sign=1739628796-Hc7Dv821zOtxZOIE32WQuLwFLbACPYrA-0-b7bee5e273e89f049c3cd6df581f4611)
运行上述代码得到的输出结果如下:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/105-2.jpg?sign=1739628796-YzN0R3qRBdgC7jrheajFF8lwkp8i5MAR-0-82ecee5c27d390d8bf57461453922fba)
最后介绍并集,它只有一个union函数,下面举例说明:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/105-3.jpg?sign=1739628796-ub1UGmX9Rur5gtKtLuOxTET1TSTYhPf0-0-7cc7a6b7141272bff3a8683544808eb6)
运行上述代码得到的输出结果如下:
![](https://epubservercos.yuewen.com/569A18/21190709001167706/epubprivate/OEBPS/Images/105-4.jpg?sign=1739628796-0jEGHMdeUtaGv5pBaxNz14x4wagAj5EY-0-85d4df7a1f38bd0b568c91ede62662a8)