一、集合的定义方法及特点
1、特点:
(1)由不同元素组成
#集合由不同元素构成
s={1,2,3,3,4,3,3,}print(s)#运行结果:{1, 2, 3, 4}
(2)集合无序
#集合无序
s={'lilei','liuhua','alax','bob','bbb','bob'}print(s)#运行结果:{'bob', 'liuhua', 'bbb', 'alax', 'lilei'}
(3)集合只能存放数字、字符串和元祖(即不可变类型)
#集合只能存放不可变类型
s={'alax',12,[1,2],('bab')}#[1,2]为列表类型
print(s)
运行结果:
2、定义方式
类型一:s={ }
类型二:s=set( )
s=set('hel')print(s)#输出结果:{'h', 'l', 'e'}
二、集合的内置方法
1、.add( ) 添加(不可添加相同元素)
#添加
s1={1,2,3}
s1.add('alax')print(s1)#输出结果:{1, 2, 3, 'alax'}
s2={1,2,3}
s2.add(3)print(s2)#输出结果:{1, 2, 3}
2、.clear( ) 清空、.copy( ) 拷贝
#清空、拷贝
s={1,2,3}
s1={'baba'}
s.clear()print(s)#输出结果:set()
s1.copy()print(s1)#输出结果:{'baba'}
3、删除 .pop( ) 随机删除 .remove( )指定删除——>元素不存在会报错 .discard( )指定删除——>元素不存在不会报错
#删除
s1={'ax',1,2,3}
s1.pop()print(s1)#运行结果:{1, 'ax', 2}
s2={'ax',1,2,3}
s2.remove('ax')print(s2)#运行结果:{1, 2, 3}#s2.remove('axxx')#print(s2)#不存在,运行结果报错
s3={'ax',1,2,3}
s3.discard('axxxx')print(s3)#运行结果:{1, 2, 3, 'ax'},不存在但是不报错
二、集合关系运算、交叉,并集
1、基本关系运算
现在我们举一个例子
例:现在有同学'bob','alax','zh'学习Python,有同学'bob','zh'学习Linux,用列表统计处即学习Python也学习Linux的同学名单。
解答:此题使用列表解决有三种写法,如下所示:
#列表举例
python_l=['bob','alax','zh']
linux_l=['zh','bob']##方法一:#for i in python_l:#for j in linux_l:#if i==j:#print(i)#运行结果:['bob', 'zh']
##方法二:#for name_l in python_l:#if name_l in linux_l:#print(name_l)#运行结果:['bob', 'zh']
#方法三:
python_l_and_linux_l=[]for name_l inpython_l:if name_l inlinux_l:
python_l_and_linux_l.append(name_l)print(python_l_and_linux_l)#运行结果:['bob', 'zh']
现在我们用集合来解决此类问题:
如上图所示,求即学习Python_l和Linux_l的同学,即求交集部分
(1)交集,A.intersection(B) A与B的交集 或者 A&B
例题所示代码表示为:
python_l=['bob','alax','zh']
linux_l=['zh','bob']#——————转化为集合形式——————————
p_l=set(python_l)
l_l=set(linux_l)#——————求两个集合的交集————————
print(p_l.intersection(l_l))#运行结果:{'zh', 'bob'}
print(p_l&l_l)#运行结果:{'zh', 'bob'}
补充:交集更新A.intersection_updata(B)
(2)并集,A.union(B) A与B的并集 或者A|B
#集合求并集
python_l=['bob','alax','zh']
linux_l=['zh','bob','hahah']#——————转化为集合形式——————————
p_l=set(python_l)
l_l=set(linux_l)#——————求两个集合的并集————————
print(p_l.union(l_l))#运行结果:{'alax', 'hahah', 'zh', 'bob'}
print(p_l|l_l)#运行结果:{'alax', 'hahah', 'zh', 'bob'}
(3)差集:即A中存在但是B中不存在的元素 A.diference(B) 或者 A-B或者B-A
#集合求差集
python_l=['bob','alax','zh']
linux_l=['zh','bob','hahah']#——————转化为集合形式——————————
p_l=set(python_l)
l_l=set(linux_l)#——————求两个集合的差集————————
print(p_l-l_l)#运行结果:{'alax'}
print(l_l-p_l)#运行结果:{'hahah'}
print(p_l.difference(l_l))#运行结果:{'alax'}
图解如下:
补充:差集更新
python_l=['bob','alax','zh','hghg']
linux_l=['zh','bob','hahah','hghg','hhhh']#——————转化为集合形式——————————
p_l=set(python_l)
l_l=set(linux_l)
p_l.difference_update(l_l)print(p_l)#运行结果:{'alax'}
(4)交叉补集 A.symmetric_difference(B) 或者 A^B
#交叉补集
python_l=['bob','alax','zh']
linux_l=['zh','bob','hahah']#——————转化为集合形式——————————
p_l=set(python_l)
l_l=set(linux_l)print(p_l.symmetric_difference(l_l))#运行结果:{'alax', 'hahah'}
print(p_l^l_l)#运行结果:{'alax', 'hahah'}
图解如下:
2、其他关系运算
(1)判断两个集合的交集是否为空 A.isdisjoint(B)
s1={'kk','bb','zz'}
s2={'kk','ss','aa'}
s3={1,2,3}
result1=s1.isdisjoint(s2)print(result1)#运行结果:False ——> 即交集不为空
result2=s1.isdisjoint(s3)print(result2)#运行结果:True -->即交集为空
(2)判断两个集合的包含关系
集合A>=B A.issubset(B) 集合A<=B A.issuperset(B)
s1={1,2,3}
s2={4,5,6,1,2,3}
result1=s1.issubset(s2)print(result1)#运行结果:True
result2=s1.issuperset(s2)print(result2)#运行结果:False
result3=s2.issuperset(s1)print(result3)#运行结果:True
(3)更新 A.update(B)
s1={1,2,5}
s2={7,8}
s1.update(s2)print(s1)#运行结果:{1, 2, 5, 7, 8}
三、补充:
集合是可变类型,当定义不可变集合时,可使用s=frozenset(**)
s=frozenset('hello')print(s)#运行结果:frozenset({'l', 'o', 'h', 'e'})#不可进行添加删除等操作