数据类型之集合
一、集合的作用
主要作用就是关系运算和去重,与列表(list)、元组(tuple)、字典(dict)一样都可以存放多个值
二、集合的定义
定义:在{}内用逗号分隔开多个元素,集合具备以下三个特点:
1:每个元素必须是不可变类型
2:集合内没有重复的元素
3:集合内元素无序
s = {1,2,3,4} # 本质 s = set({1,2,3,4})
注意1:列表类型是索引对应值,字典是key对应值,均可以取得单个指定的值,而集合类型既没有索引也没有key与值对应,所以无法取得单个的值,而且对于集合来说,主要用于去重与关系元素,根本没有取出单个指定值这种需求身份手动阀。
注意2:{}既可以用于定义dict,也可以用于定义集合,但是字典内的元素必须是key:value的格式,现在我们想定义一个空字典和空集合,该如何准确去定义两者?
d = {} # 默认是空字典
s = set() # 这才是定义空集合
三、数据类型
注意:但凡能被for循环的遍历的数据类型(强调:遍历出的每一个值都必须为不可变类型)都可以传给set()转换成集合类型
s = set([1, 2, 3, 4])
s1 = set((1, 2, 3, 4))
s2 = set({'name': 'jason'})
s3 = set('egon')
print(s,s1,s2,s3)
输出结果:{1, 2, 3, 4} {1, 2, 3, 4} {'name'} {'n', 'e', 'g', 'o'}
四、内置方法
1、关系运算:&取交集、|取并集、-取差集、^取对称差集
注意:下面的关系运算可以用符号进行,也有相应的方法进行
定义两个集合:friends1 = {"zero","kevin","jason","egon"}
friends2 = {"Jy","ricky","jason","egon"}
1.1 用&取交集:取出friends1和friends2相同的值
print(friends1 & friends2)
print(friends1.intersection(friends2))
输出结果:{'jason', 'egon'}
1.2 用 | 取并集:取出friends1和friends2所有的值,相同的值至保留一个
print(friends1 | friends2)
print(friends1.union(friends2))
输出结果:{'Jy', 'jason', 'egon', 'kevin', 'zero', 'ricky'}
1.3 用 - 取差集:取出friends1独有的值合取出friends2独有的值
注意:取差集时需要取出的值必须放在前面
print(friends1 - friends2)
print(friends1.difference(friends2))
输出结果:{'zero', 'kevin'}
print(friends2 - friends1)
print(friends1.difference(friends2))
输出结果:{'Jy', 'ricky'}
1.4 用 ^ 取对称差集:取出friends1和friends2独有的值(去掉他们共有的值)
print(friends1 ^ friends2)
print(friends1.symmetric_difference(friends2))
输出结果:{'zero', 'ricky', 'kevin', 'Jy'}
1.5 父子集:一个集合是否包含另一个集合(一个集合包含另一个集合为父子,如果相同它们互为父子)
包含则返回True,不包含则返回False
案例:
friends1 = {"zero","kevin","jason","egon"}
friends2 = {"zero","kevin","jason"}
print(friends1 > friends2) #friends1 包含friends2,表示friends1 是friends2的父亲,则返回True
print(friends1.issuperset(friends2))
输出结果:True
print(friends2 < friends1) #friends2不包含friends1,表示friends2是friends1的儿子,则返回True
print(friends2.issubset(friends1))
输出结果:False
print(friends1 == friends2) #如果friends1和friends2集合中的值一样,表示他们互为父子,则返回True
print(friends2.issubset(friends1)) # 表示friends2是friends1的父亲
print(friends1.issubset(friends2)) #表示friends1是friends2的父亲
输出结果:True
2、去重:集合去重有局限性(该知识点了解)
2.1、只能针对不可变类型去重
2.2、无法保证顺序
案例:
l=['a','b',1,'a','a'] # l中都是不可变类型
s = set(l) #把l转为为集合
print(s)
输出结果:{1, 'a', 'b'} #去重后打乱了原来的顺序
2.3、针对可变类型去重,并且需要保证原来顺序(需要自己写代码实现,python中没有提供)
案例:
# l为列表,是可变类型
l=[
{'name':'lili','age':18,'sex':'male'},
{'name':'jack','age':73,'sex':'male'},
{'name':'tom','age':20,'sex':'female'},
{'name':'lili','age':18,'sex':'male'},
{'name':'lili','age':18,'sex':'male'}
]
res = [] #定义一个空列表
for x in l : #循环遍历l中的值,放到x中
if x not in res: # x的值不在res这个空列表中,则进行以下操作
res.append(x) #把x的值加入到res这个空列表中
print(res)
输出结果:[{'name': 'lili', 'age': 18, 'sex': 'male'}, {'name': 'jack', 'age': 73, 'sex': 'male'}, {'name': 'tom', 'age': 20, 'sex': 'female'}]
3、其他内置方法:需要掌握的为discard()、update()、pop()、add(),其他的均了解即可
1、discard():删除掉集合中的元素,如果存在集合中就删除,如果不存在就不做任务事情,
注:同remove()删除一样,但是remove()删除不存在的元素会报错,所以iscard()方法更健壮
案例:
res = {1,2,3}
res.discard(3)
print(res)
输出结果:{1,2}
2、update():把新的值加入到原来集合中,但是重复的会去掉
案例:
res = {1,2,3}
res.update({1,2,5})
print(res)
输出结果:{1,2,3,5}
3、isdisjoint():比较两个集合,如果完全独立(没有交集),返回True
案例:
res = {1,2,3}
res1 = {4,5,6,7}
l = res.isdisjoint(res1)
输出结果:True
4.difference_update():求差集,并重新赋值
案例:
res = {1,2,3}
res1 = {3,4,6,7}
res.difference_update(res1) #等同于res3 = res.difference_update(res1),但是这样的话输出为none
print(res)
输出结果:{1,2}
5、pop():随机删除集合中的元素
案例:
res = {20,21,22,24,19,6,7,8,9,13,11,12,14,16,18,"a"}
res.pop()
print(res) #随机删除集合中的一个元素
6、add():添加一个元素到集合中
案例:
res = {20,21,22,24,19,6,7,8,9,13,11,12,14,16,18,"a"}
res.add("xialiang")
print(res)
输出结果:{6, 7, 8, 9, 11, 12, 13, 14, 'xialiang', 16, 18, 19, 20, 21, 22, 24, 'a'}
浙公网安备 33010602011771号