七 集合
#定义: 可变类型是不可hash类型 不可变类型是可hash类型 #定义集合: 集合:可以包含多个元素,用逗号分割, 集合的元素遵循三个原则: 1:每个元素必须是不可变类型(可hash,可作为字典的key) 2:没有重复的元素 3:无序
names=['asb','asb','asb','wsb','wsb','egon_nb',[1,2,3]]
s=set(names)
print(s)
列表为可变类型,会出错
注意集合的目的是将不同的值存放到一起,不同的集合间用来做关系运算,无需纠结于集合中单个值
##练习##
s={1,1,1,1,1,1,1,1,1,'a','b','a'}
s={(1,2,3),(1,2,3),'a','b','a'}
print(s)
s=set('hello')
print(s)
# 单纯的用集合去重,需要注意的问题是 #1、去重的目标所包含的值必须都为不可变类型 #2、去重的结果会打乱原来的顺序 3.常用操作和内置方法 #优先掌握的操作: #1、长度len #2、成员运算in和not in #3、|合集(union)
print(pythoners | linuxers) print(pythoners.union(linuxers)) #4、&交集(inteersection)
print(pythoners & linuxers) print(pythoners.intersection(linuxers)) #5、-差集(difference)
print(pythoners - linuxers) print(pythoners.difference(linuxers)) print(linuxers - pythoners) #6、^对称差集(symmetric)
print(pythoners ^ linuxers) print(pythoners.symmetric_difference(linuxers))
#7、== #8、父集:>,>= (issuperset)
s1={1,2,3,4,5}
s2={1,2,3}
print(s1 > s2) # s1包含s2
print(s1.issuperset(s2))
print(s2.issubset(s1))
#9、子集:<,<= (issubset)
4.补充操作
(1)更新
s1={1,2,3,4,5}
s1.update({4,7,8,9})
print(s1)
s1={1,2,3,4,5}
s2={2,3,7,8}
s1.difference_update(s2) # s1=s1 - s2
print(s1)
(2)pop随机删除
print(s1.pop())
(3)删除元素remove
s1={1,2,3,4,5}
s1.pop()
s1.remove(7)#删除元素不存在报错
s1.discard(7) # 即便要删除的元素不存在也不会报错
(4)isdisjoin无交集返回True
s1={1,2,3,4,5}
s2={6,7,8}
print(s1.isdisjoint(s2))
# #二:该类型总结
# 1 存一个值or存多个值
# 可以存多个值,值都必须为不可变类型
#
# 2 有序or无序
# 无序
#
# 3 可变or不可变
# set集合是可变类型
# s={1,2,3}
# print(id(s))
# s.add(4)
# print(s)
# print(id(s))
练习
有如下两个集合,pythons是报名python课程的学员名字集合,linuxs是报名linux课程的学员名字集合 pythons={'alex','egon','yuanhao','wupeiqi','gangdan','biubiu'} linuxs={'wupeiqi','oldboy','gangdan'} 1. 求出即报名python又报名linux课程的学员名字集合 2. 求出所有报名的学生名字集合 3. 求出只报名python课程的学员名字 4. 求出没有同时这两门课程的学员名字集合
print(pythons & linuxs) print(pythons | linuxs) print(pythons - linuxs) print(pythons ^ linuxs)
# 单纯的用集合去重,需要注意的问题是
#1、去重的目标所包含的值必须都为不可变类型
#2、去重的结果会打乱原来的顺序
1. 有列表l=['a','b',1,'a','a'],列表元素均为可hash类型,去重,得到新列表,且新列表无需保持列表原来的顺序 2.在上题的基础上,保存列表原来的顺序 3.去除文件中重复的行,肯定要保持文件内容的顺序不变 4.有如下列表,列表元素为不可hash类型,去重,得到新列表,且新列表一定要保持列表原来的顺序 l=[ {'name':'egon','age':18,'sex':'male'}, {'name':'alex','age':73,'sex':'male'}, {'name':'egon','age':20,'sex':'female'}, {'name':'egon','age':18,'sex':'male'}, {'name':'egon','age':18,'sex':'male'}, ]
八 数据类型总结
按存储空间的占用分(从低到高)
数字
字符串
集合:无序,即无序存索引相关信息
元组:有序,需要存索引相关信息,不可变
列表:有序,需要存索引相关信息,可变,需要处理数据的增删改
字典:无序,需要存key与value映射的相关信息,可变,需要处理数据的增删改
按存值个数区分
标量/原子类型 | 数字,字符串 |
容器类型 | 列表,元组,字典 |
按可变不可变区分
可变 | 列表,字典 |
不可变 | 数字,字符串,元组 |
按访问顺序区分
直接访问 | 数字 |
顺序访问(序列类型) | 字符串,列表,元组 |
key值访问(映射类型) | 字典 |