一、集合的定義方法及特點
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 in python_l: if name_l in linux_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'}) #不可進行添加刪除等操作