![代替VBA!用Python轻松实现Excel编程](https://wfqqreader-1252317822.image.myqcloud.com/cover/254/43738254/b_43738254.jpg)
1.8 集合
集合是只有键的字典,元素不能重复。集合也用{}(花括号)表示。集合中的元素是没有先后次序的,不能索引。可以向集合中添加元素,或者从集合中删除元素,但不能修改元素的值。对于多个集合,可以计算它们的交集、并集和差集等。
1.8.1 集合的创建
使用{}(花括号)可以直接创建集合,元素可以有不同的数据类型。下面创建一个集合。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/053-4.jpg?sign=1738840427-biFqRVbKFkbpR30i8wsd3nyYXEUluYZY-0-36170ad2a9c7c6f193ac8fe7319fecad)
注意:集合中的元素可以无序,但是必须唯一,也就是不能重复。
使用set函数也可以创建集合,或者把其他可迭代对象转换为集合。其他可迭代对象包括字符串、区间、列表、元组、字典等。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/053-5.jpg?sign=1738840427-k3te8gpoZeAfVQemOFeE777jRwWaCV0y-0-4a65d2b72f267208fd43f8f415aba775)
如果可迭代对象中存在重复数据,则最后生成的集合中只保留一个。利用集合的这个特点,可以对给定数据进行去除重复数据的操作。例如:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/054-2.jpg?sign=1738840427-UsVj5SXWJOnoXktrlIRqn0YUzf7yuQeY-0-d5633816aff89b79d611420286fb2605)
集合中元素的个数被称为集合的长度。使用len函数计算集合的长度。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/054-3.jpg?sign=1738840427-bNu6TUrYy5o2mz2rcUMczad6COl6vkFo-0-5c61743c694b44142f399724aa121b26)
或者
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/054-4.jpg?sign=1738840427-VlkddRDnlr7wuIYiGfkHCBNZM33cR8WU-0-ecd3b084655939b3b1acc8ee841249c6)
1.8.2 集合元素的添加和删除
使用集合对象的add方法向集合中添加元素。下面创建一个集合st并向该集合中添加元素4。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/054-5.jpg?sign=1738840427-ctlm1OB6MJj8fW4MxW4Gbxm27Rv6U85u-0-051facdc1fb1373bec021a91793d292a)
使用集合对象的remove方法从指定集合中删除元素。下面的代码从集合st中删除元素4。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/054-6.jpg?sign=1738840427-oWK3bmEXA1YBvszFZJQWWDOgqJ7Sy3LX-0-97287d74d2f461dc1b3621633793c07f)
使用集合对象的clear方法将集合中的所有元素清空。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/054-7.jpg?sign=1738840427-GeTyKcvCBiXRtEbc9LNi6XIfE2yDnchx-0-3ba9716cd1dddc23b71c862816baef50)
1.8.3 集合的运算
集合的运算包括集合的交运算、并运算、差运算、对称交集运算等。
1. 交运算和并运算
对于图1-5中所示的A和B两个圆形区域,把它们看作是两个集合,它们的交集是中间深颜色的重叠部分,即C区域,它们的并集是所有阴影区域。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/055-01.jpg?sign=1738840427-n38AoJ4u6naMaC58U2YHpntscoLhFYNu-0-3ef6a836b3e1c12dd60e2c3f48173c19)
图1-5 集合的交运算和并运算
在Python中,可以使用“&”运算符或集合对象的intersection方法求给定的两个集合的交集。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/055-2.jpg?sign=1738840427-wyGpMrrFEJgBySnEBs8vrpLO2lQ3PGXn-0-ebbbf6828149dcdfcb601b9174dee98f)
可见,给定的两个集合的交集即这两个集合共有的元素组成的新集合。
使用“|”运算符或集合对象的union方法求给定的两个集合的并集。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/055-3.jpg?sign=1738840427-WUPzfYbRzhOcA8YusgBj61GIVW2A5gnz-0-07e908e05a9e7de06ded7e794eab0c27)
可见,给定的两个集合的并集即这两个集合的所有元素放在一起并去掉重复元素后得到的新集合。
2. 差运算
如图1-6所示,用A和B两个圆形区域表示两个集合,则它们之间的差集A-B就是A减去A和B的交集,对应于图中A区域的深色部分。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/055-02.jpg?sign=1738840427-XiFTnKvFcUryJDyv3MNxBbRTSddBEAhk-0-d3c766e9e27b5e198a66a0becc12deaa)
图1-6 集合的差运算
便用-(减号)或集合对象的difference方法求给定的两个集合的差集。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/055-4.jpg?sign=1738840427-4d1MLYKEwul45MU1hgTaNA5b3ZvZOn7Q-0-19f2398cbe3ff0f2b86771f307c4550a)
可见,给定的两个集合的差集即它们各自减去二者的并集后得到的新集合。
3. 对称差集运算
如图1-7所示,用A和B两个圆形区域表示两个集合,则它们的对称差集为它们的并集减去它们的交集得到的新集合,对应于图中的阴影部分。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/056-01.jpg?sign=1738840427-I8YlKwk7TYXtTuJvWRkJVMyUTM0HJo2R-0-543ed86bdf994fee7d6832f7e345af58)
图1-7 集合的对称差集运算
使用“^”运算符或集合对象的symmetric_difference方法计算给定集合的对称差集。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/056-2.jpg?sign=1738840427-KZhX0ikTpAjUmVO7L1TQpVReeByD1pez-0-0fd30fa42d4b922429bb75d34abbcab8)
集合{1,2,3}和{1,2,5}的并集为{1,2,3,5},交集为{1,2},对称差集等于给定集合的并集减去交集,所以为{3,5}。
4. 子集、真子集、超集和真超集
如图1-8所示,用A和B两个圆形区域表示给定的两个集合,如果A与B重叠或者A被B包含,则称A表示的集合是B表示的集合的子集,B表示的集合是A表示的集合的超集。如果排除大小相同并重叠的情况,即A完全被B包含,则称A表示的集合是B表示的集合的真子集,B表示的集合是A表示的集合的真超集。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/056-02.jpg?sign=1738840427-jolb1vaXhXdPfXQK6OuTmRFCRb00CzQk-0-1765c33966e3e361718dd8f888c786be)
图1-8 子集和超集
使用“<=”运算符或集合对象的issubset方法进行子集运算。对于集合A和集合B,如果A<=B,或者A.issubset(B)的返回值为True,则集合A是集合B的子集。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/057-1.jpg?sign=1738840427-duHFb6zonxmtvLwEshyLbZyh7KQguDPB-0-cf0506d2b341623b0f9b913f2f0b2e9c)
对于集合A和集合B,如果A<B,则集合A是集合B的真子集。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/057-2.jpg?sign=1738840427-Idfxsa5cfdaMFMcCx2hJkOicUiKCLFOb-0-ec38255e5b5fcad4397c3fe5cc2ba335)
对于集合A和集合B,如果A>=B,或者A.issuperset(B)的返回值为True,则集合A是集合B的超集。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/057-3.jpg?sign=1738840427-Gov0AttaNlMDeEyJNDo0CifLPWvAufcG-0-5bc2e7449f3fd3331804f144a42aa7cf)
对于集合A和集合B,如果A>B,则集合A是集合B的真超集。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/057-4.jpg?sign=1738840427-GY2sAD7d2EBGu3JBuVvIlUB4aw6qNesD-0-4b4426202100c45944fb0e5f852839cf)