python學習筆記24_集合set( )

weixin_33751566發表於2018-03-16

python 筆記24

集合 set

集合是一個無序的,不重複的資料組合,它的主要作用如下:

  • 去重,把一個列表變成集合,就自動去重了
  • 關係測試,測試兩組資料之前的交集、差集、並集等關係

集合(set):把不同的元素組成一起形成集合,是python基本的資料型別。

集合元素(set elements):組成集合的成員(不可重複)

li=[1,2,'a','b']
s =set(li)
print(s)    

輸出: {1, 2, 'a', 'b'}
 
li2=[1,2,1,'a','a']
s=set(li2)
print(s)  

輸出: {1, 2, 'a'}

集合物件是一組無序排列的可雜湊的值:集合成員可以做字典的鍵
但是可變集合整體卻是不可雜湊的

li=[[1,2],'a','b']
s =set(li) #TypeError: unhashable type: 'list'
print(s)

這裡[1,2]是不可雜湊的,所以會報錯。
(回顧:列表和字典是不可雜湊的)


既然集合是無序的,那麼怎麼獲取資料呢?

方法一:放進for迴圈遍歷。
方法二:放進迭代器(後面會講)。


集合分類:可變集合、不可變集合

可變集合(set):可新增和刪除元素,非可雜湊的,不能用作字典的鍵,也不能做其他集合的元素

不可變集合(frozenset):與上面恰恰相反

li=[1,'a','b']
s =set(li)
dic={s:'123'} 

輸出:
TypeError: unhashable type: 'set'

集合的相關操作

1、建立集合

由於集合沒有自己的語法格式,只能通過集合的工廠方法set()和frozenset()建立

s1 = set('alvin') 
s2= frozenset('yuan')
print(s1,type(s1))  
print(s2,type(s2)) 

輸出:
    {'l', 'v', 'i', 'a', 'n'} <class 'set'>
    frozenset({'n', 'y', 'a', 'u'}) <class 'frozenset'>

2、訪問集合

由於集合本身是無序的,所以不能為集合建立索引或切片操作,只能迴圈遍歷或使用in、not in來訪問或判斷集合元素。

s1 = set('alvin')
print('a' in s1)
print('b' in s1)

for i in s1:
    print(i)

輸出:
    
 True
 False
 i
 a
 n
 v
 l

3、更新集合

可使用以下內建方法來更新:

s.add() #加單個元素,寫什麼新增什麼
s.update() #加多個元素,把每個序列都新增進去
s.remove() #移除某個元素

注意只有可變集合才能更新:

s2=set('alvin')
s2.add('mm')
print(s2) 
 
s2.update('HO') 
print(s2) 
s2.update([12,'Flamingo'])  

#  新增列表也是講列表中的每個元素加進集合中,而不會將12分解成1和2,或將flamingo分解成f,l,a,m,i,n,g,o。

print(s2)
s2.remove('l')
print(s2)  

輸出: 
{'a', 'n', 'l', 'i', 'v', 'mm'}
{'a', 'H', 'n', 'l', 'i', 'O', 'v', 'mm'}
{'a', 'H', 12, 'n', 'Flamingo', 'l', 'i', 'O', 'v', 'mm'}
{'a', 'H', 12, 'n', 'Flamingo', 'i', 'O', 'v', 'mm'}

注意:s2.update(12,'Flamingo')這種寫法則是錯誤的。

4、刪除

s2.pop( ) #隨機刪除一個元素
s2.clear( ) #清空列表,保留集合這個容器
del s2 #刪除整個集合


集合型別操作符

1 in ,not in
2 集合等價與不等價(==, !=)
3 子集、超集

在瞭解集合相關操作符號之前,我們先明確一下數學概念:

10723778-c57f1251a774f331.png

10723778-afcf42453a67ba41.png

父級子級判定

10723778-6507a0cd0dcb9c6c.png

相關文章