一、基础复习
集合与字典区别
集合中所有元素都是独一无二的,并且也是无序的。
集合具有唯一性、无序性、有限性
>>> type({}) #字典
<class 'dict'>
>>> type({"one"}) #集合
<class 'set'>
>>> type({"one":1}) #字典
<class 'dict'>
二、集合的简单用法
1.集合创建的三种方法
#第一种是花括号里面传入多个元素
>>> {"FishC","Python"}
{'Python', 'FishC'}
#第二种是集合推导式
>>> {s for s in "FishC"} # 集合中元素是无序的
{'s', 'i', 'F', 'C', 'h'}
#第三种是 set()方法
#这里源码是set(iterable),所以传入的"FishC"会被看作是可迭代对象进行迭代,而不是单个字符串
>>> set("FishC")
{'s', 'i', 'F', 'C', 'h'}
2.集合是无序的,不能通过下标索引访问
>>> s=set("FishC")
>>> s[0]
Traceback (most recent call last):
File "<pyshell#10>", line 1, in <module>
s[0]
TypeError: 'set' object is not subscriptable
3.判断某一元素是否在集合中
>>> set("FishC")
{'s', 'i', 'F', 'C', 'h'}
>>> 'C' in s
True
>>> 'c' in s #字符不在集合中
False
4.访问集合元素
迭代方式访问
>>> set("FishC")
{'s', 'i', 'F', 'C', 'h'}
>>> for each in s:
print(each)
s
i
F
C
h
5.集合唯一性的几种用法
对列表重复元素进行去重,判断列表是否有重复元素
>>> set([1,1,2,3,5]) #对列表重复元素进行去重
{1, 2, 3, 5}
>>>
>>> s=[1,1,2,3,5] #判断列表是否有重复元素
>>> len(s)==len(set(s))
False
6.集合的浅拷贝
>>> s=[1,1,2,3,5]
>>> t=s.copy()
>>> t
[1, 1, 2, 3, 5]
三、 集合的各种方法合集:子、交、并、补、差、对称差集
1.集合的浅拷贝
>>> s=[1,1,2,3,5]
>>> t=s.copy()
>>> t
[1, 1, 2, 3, 5]
2.判断两个集合是否毫不相关
s.isdisjoint(other) 如果 s 集合中没有与 other 容器存在共同的元素,那么返回 True,否则返回 False
>>> s=set("FishC")
>>> s
{'s', 'i', 'F', 'C', 'h'}
>>> s.isdisjoint(set("Python")) #返回False说明它们相关,有公共的h
False
>>> s.isdisjoint(set("JAVA")) #两集合无关
True
>>>
>>> s.isdisjoint("JAVA") # 传入字符串,显然与集合无关
True
>>> s.isdisjoint("Python") #传入字符串,显然与集合相关
False
3.子集
子集:对于两个集合 A、B,如果集合 A 中任意一个元素都是集合 B 中的元素,我们就说这两个集合有包含关系,称集合 A 为集合 B 的子集(Subset)
>>> set("FishC")
{'s', 'i', 'F', 'C', 'h'}
>>> s.issubset("FishC.com.cn")
True
>>> s.issuperset("Fish")
True
使用运算符,符号两边都必须是集合类型的数据才行,否则会报错,错误用法:
>>> set("FishC")
{'s', 'i', 'F', 'C', 'h'}
>>> s<="FishC"
Traceback (most recent call last):
File "<pyshell#58>", line 1, in <module>
s<="FishC"
TypeError: '<=' not supported between instances of 'set' and 'str'
>>>
运算符方法检测: 真集使用小于号 <
>>> s <=set("FishC") #真集
True
>>> s<set("Fish")
False
>>> s<set("FishC")
False
>>> s<set("FishC.com.cn") #真子集
True
4.并集
并集:对于两个集合 A、B,把他们所有的元素合并在一起组成的集合,叫做集合 A 与集合 B 的并集(Union)。
>>> set("FishC")
{'s', 'i', 'F', 'C', 'h'}
>>> s.union({1,2,3})
{1, 2, 3, 'C', 's', 'h', 'i', 'F'}
>>> s.union({1,2,3},"python")
{'y', 1, 2, 3, 's', 'F', 'p', 'i', 't', 'n', 'C', 'o', 'h'}
运算符方法检测:并集使用管道符
这条竖线 | 称为管道符
>>> s | {1,2,3} | set("Python")
{'y', 1, 2, 3, 'P', 's', 'i', 'F', 't', 'n', 'C', 'o', 'h'}
5.交集
交集:对于两个集合 A、B,由所有属于集合 A 且属于集合 B 的元素所组成的集合,叫做集合 A 与集合 B 的交集(Intersection)。
>>> set("FishC")
{'s', 'i', 'F', 'C', 'h'}
>>> s.intersection("Fish")
{'h', 'i', 'F', 's'}
>>> s.intersection("Php","Python")
{'h'}
运算符方法检测:交集使用&符号
>>> s & set("Php") & set("Python")
{'h'}
5.差集
差集:对于两个集合 A、B,由所有属于集合 A 且不属于集合 B 的元素所组成的集合,叫做集合 A 与集合 B 的差集(Difference)。
>>> set("FishC")
{'s', 'i', 'F', 'C', 'h'}
>>> s.difference("Fish")
{'C'}
>>> s.difference("Php","Python")
{'C', 's', 'i', 'F'}
运算符方法检测:差集使用减号 -
>>> s - set("Php") - set("Python")
{'i', 'C', 'F', 's'}
6.对称差集
s.symmetric_difference(other) 返回一个新集合,其内容是排除掉 s 集合和 other 容器中共有的元素后,剩余的所有元素。
>>> s.symmetric_difference("Python")
{'y', 'P', 's', 'i', 't', 'F', 'n', 'C', 'o'}
运算符方法检测:对称差集使用脱字符 ^
>>> s ^ set("Python")
{'y', 'P', 's', 'F', 'i', 't', 'n', 'C', 'o'}
7.超集
使用运算符判断集合大小
>>> s>set("FishC") #真超集
False
>>> s>=set("FishC") #超集
True
课后题:
1.如果存在多个列表,需要筛出这些列表中相同的元素,可以使用什么方法?
答:将它们转换为集合,然后进行交集运算,得出的结果便是它们之间共同拥有的元素。
解析:
>>> # 方法一
>>> l1 = [1, 2, 3, 4, 5]
>>> l2 = [1, 3, 5, 7, 9]
>>> l3 = [1, 1, 2, 3, 5]
>>> set(l1).intersection(l2, l3)
{1, 3, 5}
>>> # 方法二
>>> set(l1) & set(l2) & set(l3)
{1, 3, 5}
2.请问下面代码的执行结果是?
>>> s1 = set("fishc.com.cn")
>>> s2 = set("ilovefishc.com")
>>> s1 - s2
答:{‘n’}
解析:集合之间使用减号(-)运算符,执行的是差集运算(就是找出存在于该集合,但不存在于其它集合中的元素),也可以使用 s1.difference(s2) 得到等值的结果。
3.请问下面三个图形中,A 和 B 通过什么操作会变成 C?
A.B.C.答:对称差集。
解析:相当于偶数次重叠的有,奇数次重叠的没有。
题目来自小甲鱼 集合(上)