集合是一个无序的不重复的元素序列,这与C++中的set容器有一点点像,在Python这里成了基本数据类型了;
一.创建集合
1.空集合
用{}或者set()函数都可以创建一个集合,不过这里要注意在创建一个空集合时不能用{},因为{}表示的是空字典,所以只能用set()表示一个空集合:
a = set()
b = {}
print(type(a))
print(type(b))
#输出:
<class 'set'>
<class 'dict'>
2.集合解析式
集合解析式和列表解析式是一样的,举个例子:
number = [1,2,3,4,5,6,7,8,9]
a = {value for value in number if value%2==0}
print(a)
#输出:
{8, 2, 4, 6}
可以看到,输出的是8,2,4,6,这也说明了集合内部是无序的这一特性;
二.集合相关操作
1.添加、移除元素
嗯?怎么没有访问?
还想着访问呢?既然集合是无序的,那么通过索引对集合内单个元素的访问肯定也是不被支持的,Python不支持通过索引对集合元素的访问;
添加:
1.1 利用方法add()向集合内添加元素,这里注意,因为集合要时刻保持其内部的无重复性,因此是不能添加可变数据的,万一添加一个可变的进去它有事没事变一下子可咋办?万一变得和集合内其它元素一样了那这集合岂不就名不副实了,所以利用add()方法添加的对象只能是不可变的数值、字符串、元组或者布尔型,如果试图添加列表、字典等可变值就会报错;
a = {1,2,3}
a.add(4)
print(a)# {1, 2, 3, 4}
1.2 如果你实在要添加一个列表进去,嘛也不是不可以,这时就需要我们的update()方法登场了,update()里面的参数可以是任何值,起初我还不太相信,就把所有类型都试了一遍,然后发现,update()果然是个狠角色…
通过update()方法,你可以添加包括集合、列表、字典在内的各种数据类型,尽管我也不明白为啥说了集合中不能加入可变数据但还是能用update()添加,但管它那么多,用就是了,百度了一下没有结果,所以这个疑问先遗留一下;
只不过在使用update()添加字典时要注意,添加进去的只有字典的键,这个已经经过我的实验验证,可以再看一个例子:
dict = {'a':7,6:'f'}
a = {1,2,3}
a.update(dict)
print(a)# {1, 2, 3, 'a', 6}
可以看到只有键被添加进了集合中,这也难怪,字典中的键本来就要求不可变且不重复,放在set里面简直浑然天成;
移除:
a.利用remove()方法移除要注意一点,如果要移除的元素在集合内不存在,那么就会发生错误;
b.discard()方法与remove()差不多,唯一的区别在于待移除元素在集合内不存在时,discard()什么都不会抛出;
c.也可以用pop()随机删除集合内元素,这就比较刺激了吧,其实这里和字典中的一样,pop()删除的还是底部元素,只不过集合是无序的,也就达到一种随机效果了;
2.交集、并集、差集
既然集合自动去重,那么就可以完成交集、并集以及差集的运算:
交集:
a = {1,2,3}
b = {3,4,5}
print(a&b)# {3}
并集:
a = {1,2,3}
b = {3,4,5}
print(a|b)# {1, 2, 3, 4, 5}
差集:
a = {1,2,3}
b = {3,4,5}
print(a-b)# {1, 2}
print(b-a)# {4, 5}
对称差集:
a = {1,2,3}
b = {3,4,5}
print(a^b)# {1, 2, 4, 5}
交集与并集我就不多说了,对于两个集合A、B,集合A减去A、B的交集的结果就是A-B的结果,也叫做A-B的差集,A与B的并集减去A与B的交集叫做A与B的对称差集;
三.有关集合的常用方法
add() :
clear() :
copy() :
remove():
discard():
pop() :
update():
以上这些就不说了;
difference():返回多个集合的差集,对,多个集合,所以3个以上也没问题:
a = {1,2,3,4,5,6,7,8}
b = {3,4,5}
c = {5,6,7}
d = a.difference(b,c)
print(d)# {1, 2, 8}
如上,3,4,5,6,7被减去,a.difference(b)就是a-b,顺序不要记差了;
union() :返回多个集合的并集:
a = {1,2,3}
b = {3,4,5}
c = {5,6,7}
d = a.union(b,c)
print(d) #{1,2,3,4,5,6,7}
intersection():返回多个集合的交集,例子就不说了吧,都是一样的;
symmetric_difference():返回多个集合的对称差集;
以上四个方法刚好是集合的四种操作,且它们返回的都是一个新集合;
以下三种与以上对应的几种功能基本一致,不过下面三种不返回新集合,它们在原集合上操作:
difference_update();
intersection_update();
symmetric_difference_update();
注意没有union_update()!
isdisjoint():判断两个集合是否没有交集,有交集返回False,没有返回True,注意这个可不能判断多集合,只能用于判断两个集合;
set1.issubset(set2):判断set1是否是set2的子集;
set1.issuperset(set2):判断set2是否是set1的子集;
四.创建一个frozenset
你可以把它拆开来看,frozen意为冻结,集合被冻结?不难猜到,frozenset是用来创建一个不可变集合的,创建一个frozenset之后,原先set里面任何能够对set进行修改的方法对frozenset均不适用,frozenset支持的方法有:
['copy', 'difference', 'intersection', 'isdisjoint', 'issubset', 'issuperset', 'symmetric_difference', 'union']
以上这些方法的用法与set中的一样,不再介绍;
部分内容(不限于本文)参考自: