python序列之集合
python中集合用于保存不重复元素,分为可变集合(set),不可变集合(frozenset)两种,可变集合为无序可变序列,集合中的所有元素都放在一对”{}”中,两个元素之前通过逗号分隔。
一、集合的创建:
python中提供两种创建集合的方法:一种是直接使用”{}”创建,一种是通过set()函数将列表、元组等可迭代对象转换为集合,推荐使用第二种方法。
1、通过”{}”方式来创建集合:语法格式如下:
setname = {element1,element2,element3,…elementn}
注意:在创建集合的时候,如果输入了多个重复的元素,python会自动保留一个,由于set集合是无序的,因此每次输出的集合内容的顺序可能不同。
例如:定义一个集合,并执行命令打印集合,如图:

从打印结果可以看出,每次打印的顺序都是不同的,如图:

2、通过set()函数进行创建集合:语法格式如下
setname = set(iteration)
setname表示集合的名字,iteration表示可迭代对象,可以是元组、列表、字符串或者range对象,如果是字符串,返回的集合将是包含全部不重复字符的集合。
例如:定义集合,并打印集合中的元素,执行命令:

打印后的结果可以看到,字符串中重复的字符将只显示一个,如图:

注意:创建一对空集合的时候,只能通过set()来实现,因为如果使用”{}”表示创建一个空字典。
如果字典中的值有重复元素,在获取字典中全部值后想过滤掉重复元素,此时即可使用集合,如图:


注:set()直接用在lists.values()这里,是将值转换为集合,然后使用for遍历集合,如果放在print(set(v))中,那打印出来的还是集合而不是一个值
二、集合元素的添加和删除:
1、向集合中添加元素:
向集合中添加元素通过add()方法实现,语法格式如下:
setname.add(element)
例如:向集合中添加元素,并打印添加之后的集合内容,如图:


向集合中添加任何可变序列的时候,需要将可变序列转换为元组,如图:


2、从集合中删除元素:
在python中,可以使用del语句,删除整个集合,也可以通过pop()或者remove()方法删除一个元素,或者使用集合对象的clear()清空集合,删除全部元素,变成空集合。
例如:定义一个集合,并通过命令移除元素,如图:


注意:在使用结合的remove()方法时,如果碰到不存在的元素,将会抛出异常,因此最好通过if语句进行判断,如图:

三、集合的交集、并集和差集运算:
集合最常用的操作就是进行并集、交集、差集以及对称差集运算
1、并集运算可使用union()方法或者”|” 运算符
(1)、下面例子使用union()方法来进行并集运算,如图:

运行结果如下:

(2)、下面例子是使用运算符 “|” 来进行并集运算,如图:

运行结果如下:

注意:并集后重复的元素只保留一个,并且顺序是不固定的
2、差集运算使用differenct()方法或者”-“运算符
(1)、下面例子使用”-” 运算符来实现差集运算,如图:


从上图可以看出,我们计算的是sets和liststoset的差集运算,因此结果的元素是要在sets而不在liststoset,如果将上面print中的写成liststoset – sets,那么结果将变成{“e”,”f”,”100″},也就是在liststoset而不在sets中的元素
(2)、使用difference来实现差集运算,如图:


3、交集运算使用”&”运算符或者intersection()方法实现
(1)、下面例子使用”&”运算符来实现并集运算,如图:


(2)、下面使用intersection()方法来实现并集运算,如图:


4、使用”^”运算符或者symmetric_difference()方法实现对称差集(保留两者独有的元素,移除共有的元素)
(1)、下面使用”^”运算符来实现对称差集,原集合不变,生成新集合,如图:


(2)、使用symmetric_difference实现对称差集运算,原集合不变,生成新集合,如图:


注:如果两个集合完全相同,那么新的集合将会是空集合
进行交集运算时使用”&”符号,进行并集运算时使用”|” 符号,进行差集运算时使用”-“符号,进行对称差集时使用”^”符号。
5、集合的update()方法可以将一个或多个可迭代对象的元素添加到当前集合中,参数必须为可迭代对象,如图:


6、intersection_update()方法用于修改原集合,仅保留当前集合与一个或者多个可迭代对象的交集部分,参数必须为可迭代对象,如图:


上面是修改了a集合,保留了a、b、c三个可迭代列表的交集元素,如果没有共同元素,原集合会被清空
7、difference_update() 方法用于原地修改集合,移除当前集合中与一个或多个可迭代对象共有的元素,仅保留当前集合独有的元素,参数必须为可迭代对象,如图:


注:可以理解为修改原集合a,把a中与b和c相同的元素去除,保留剩余的元素即可
如果当前集合中所有元素都和其他可迭代对象中元素重叠,那么当前集合会被清空,如下:
a = {1,2,3}
b = {1,2,3,4,5}
a.difference_update(b)
print(a) #set(),为空集合
8、symmetric_difference_update() 方法用于原地修改集合,将其更新为当前集合与另一个可迭代对象的对称差集(即仅保留两者独有的元素,移除共有的元素),参数必须为可迭代对象,如图:


symmetric_difference_update与^= 运算符等价,因此上面可写成
a ^= set(c) #必须将列表转换为集合才行
注:如果两个集合完全相同,原集合会被清空
9、issubset() 方法用于判断当前集合是否为另一个集合的子集,参数必须为可迭代对象,如图:


issubset() 与运算符<= 功能相同,因此上述可写为:
a <= set(c) #这里要显示的将列表转换为集合,会增加开销
注:空集为任何集合的子集
10、issuperset() 方法用于判断当前集合是否为另一个集合的超集(即另一个集合的所有元素是否都包含在当前集合中),参数必须为可迭代对象,如图:


issuperset()与运算符 >= 等价,因此上面可以写成:
c >= a
注:任何集合都是空集的超集
11、isdisjoint() 方法判断当前集合与另一个可迭代对象是否互斥(即两者是否没有共同元素),参数必须为可迭代对象,如图:




