第十一讲:集合
集合
概念:
set集合是python中一种基本数据类型,分为可变集合和不可变集合两种。集合是无序不重复元素集,包括创建集合set,向集合中添加元素,删除集合中的元素,求集合的交集,并集,差集等操作。
可变集合:需要的参数必须是迭代器类型,如序列,字典,然后转换成无序不重复的元素集。由于集合是不重复的,所以可以对字符串,列表,元素进行去重操作。
不可变集合:集合中的元素不可以被改变,不能做插入和删除操作,其他方法和可变集合基本相同。
1、创建集合:
创建空集合:
s=set() ss=set([]) st=set(())
创建非空集合:参数必须是序列(字符串,列表,元素),字典,不能是数值类型
#字符串做参数 s1=set('hellopython') print (s1) #列表做参数 s2=set([1,2,3,4]) print (s2) #元素做参数 s3=set((1,2,3,4)) print (s3) #字典做参数 s4=set({'name':'cwx','age':18}) print(s4)
#set集合做参数 s5=set(s3) print (s3)
注意:字典转set集合,只取字典的key,相当于将字典中的dict.keys()列表转化成set集合。
2、添加集合元素(add,update)
add():将要添加的元素作为一个整体添加到集合中。
update():把要传入的元素拆分成单个字符,存于集合中,并去掉重复的
#add添加元素,作为一个整体添加到集合中 sTest=set('one') sTest.add('Two') print ('add添加后的元素',sTest) #update添加元素,拆分单个字符,去掉重复字符 sTest1=set('one') sTest1.update('Two') print ('update添加后的元素',sTest1)
运行结果:
add添加后的元素 {'Two', 'e', 'o', 'n'}
update添加后的元素 {'e', 'w', 'T', 'o', 'n'}
3、删除集合的元素(remove、discard、pop)
remove:确保元素存在,不存在则抛出KeyError异常
sTest=set('helloy') sTest.remove('y') print ('删除后的集合是:',sTest)
sTest.remove('a')
print ('删除后的集合是:',sTest)
运行结果:
删除后的集合是: {'e', 'l', 'h', 'o'}
Traceback (most recent call last):
File "E:/workplace/2019pratice/practice1.py", line 456, in <module>
sTest.remove('a')
KeyError: 'a'
discard:如果元素存在则删除,如果不存在则什么也没做,该函数没有返回值
sTest=set('helloy') sTest.discard('y') print ('discard删除元素后的集合',sTest) #元素存在则删除 sTest.discard('a') print ('discard删除元素后的集合',sTest) #元素不存在什么也没做
pop:随机删除集合中的某个元素,如集合为空则抛出KeyError异常
sTest=set('helloy') sTest.pop() print ('pop删除元素后的集合',sTest) #随机删除集合中的元素 sTest1=set() sTest1.pop() print ('pop删除元素后的集合',sTest) #集合为空则抛出KeyError异常
运行结果:
pop删除元素后的集合 {'l', 'h', 'y', 'o'}
File "E:/workplace/2019pratice/practice1.py", line 464, in <module>
sTest1.pop()
KeyError: 'pop from an empty set'
clear:清空集合元素
sTest=set('helloy') sTest.clear() print ('清空后的集合是',sTest)
运行结果:
清空后的集合是 set()
5、遍历集合
#for遍历集合元素
sTest = set(['e', 'two', 'o', 'n', '1', '3', '2']) for i in sTest: print (i)
运行结果:
2
n
3
1
e
o
two
# 带索引序号的遍历: sTest = set(['e', 'two', 'o', 'n', '1', '3', '2']) for index,elem in enumerate(sTest): print ('元素的索引是',index,'对应的元素是',elem)
运行结果:
元素的索引是 0 对应的元素是 e
元素的索引是 1 对应的元素是 o
元素的索引是 2 对应的元素是 3
元素的索引是 3 对应的元素是 1
元素的索引是 4 对应的元素是 n
元素的索引是 5 对应的元素是 two
元素的索引是 6 对应的元素是 2
6、集合与序列(字符串,列表,元素)间的转换:(序列转集合,重复会被去掉)
集合与字符串的转换:
testStr = 'python is good' # 字符串转集合 st=set(testStr) print ('字符串转集合后:',st) # 集合转字符串,str() s=str(st) print ('集合转字符串后:',s) # 集合转字符串,join() s1=''.join(st) print (s1) 运行结果: 字符串转集合后: {'o', 'p', 'y', 's', 't', 'd', 'h', 'i', 'n', ' ', 'g'} 集合转字符串后: {'o', 'p', 'y', 's', 't', 'd', 'h', 'i', 'n', ' ', 'g'} opystdhin g
集合与列表的转换:
listTest = [1, 2, 3, 2, 'a', 'b'] # 列表转集合 slist=set(listTest) print ('列表转集合:',slist) # 集合转列表 list1=list(slist) print ('集合转列表:',list1)
运行结果:
列表转集合: {'a', 1, 2, 3, 'b'}
集合转列表: ['a', 1, 2, 3, 'b']
集合与元组的转换:
tupTest = (1, 2, 3, 2, 'a', 'b') # 元组转集合 stupe=set(tupTest) print ('列表转集合:',stupe) # 集合转元组 tupe1=tuple(stupe) print ('集合转元组:',tupe1) 运行结果: 列表转集合: {1, 2, 3, 'a', 'b'} 集合转元组: (1, 2, 3, 'a', 'b')
练习:结合set对象,列表某个list中所有元素出现的个数
listB=['a','b','c','a','b','a'] for i in set(listB): print (i,'出现%d次'%listB.count(i)) 运行结果: a 出现3次 c 出现1次 b 出现2次
7、集合间的操作:交集(&)、并集(|)、差集(-)
交集(&):两个集合共同元素组成的集合
s1=set([1,2,3]) s2=set([1,3,4,5]) print ('两个集合的交集是',s1&s2) #交集 运行结果: 两个集合的交集是 {1, 3}
并集(|):两个集合所有的,并去掉重复的元素组成的集合
s1=set([1,2,3]) s2=set([1,3,4,5]) print ('两个集合的并集是',s1|s2) #并集 运行结果: 两个集合的并集是 {1, 2, 3, 4, 5}
差集(-):在集合1但不在集合2中组成的集合
s1=set([1,2,3]) s2=set([1,3,4,5]) print ('两个集合的差集是',s1-s2) #差集 运行结果: 两个集合的差集是 {2}
8、集合间的运算: >、<、、>=、<=、!=、==(==:判断一个集合是否完全包含另一个集合)
s1=set([1,2,3]) s2=set([1,2,3,4,5]) print (s1>s2) print (s1<s2) print (s1==s2) 运行结果: False True False
判断父亲集合函数:issuperset(),等同于>符号
判断是否是子集函数:issubset(),等同于<符号
s1=set([1,2,3]) s2=set([1,3,4,5]) s3=set([1,3]) print (s2.issuperset(s3)) print (s3.issubset(s2)) print (s2.issuperset(s1)) print (s1.issubset(s2)) 运行结果: True True False False