您現在的位置是:首頁 > 籃球

Python“六君子”之Set

  • 由 程式猿的百寶箱 發表于 籃球
  • 2022-05-27
簡介如上圖所示,我們定義了一個水果的集合fruit,看大家比較餓了,蘇蘇還特意多加了一個‘apple’和‘orange’,不過這顯然是徒勞的,因為集合中不允許有重複元素

集合裡的元素是什麼意思

Python“六君子”之Set

,謝謝大家的關注,今天我們來探索一下Python“六君子”之Set,即集合。我們大家對集合並不陌生,比如:超級女聲、快樂男生、學校裡的學生、菜市場的蔬菜、工廠裡的職工、周杰倫一年的演唱會、每場演唱會的歌迷等都是生活中集合的體現。那麼集合是什麼呢?百度百科中給了這樣一個解釋,

集合是指具有某種特定性質的具體的或抽象的物件彙總成的集體,這些物件稱為該集合的元素

。例如全中國人的集合,它的元素就是每一箇中國人。我們通常用大寫字母如A,B,S,T,。。。表示集合,而用小寫字母如a,b,x,y,。。。表示集合的元素。若x是集合S的元素,則稱x屬於S,記為x∈S。若y不是集合S的元素,則稱y不屬於S,記為yS。一般的我們把含有有限個元素的集合叫做有限集,含無限個元素的集合叫做無限集。

瞭解完基本概念後,讓我們看看集合在Python3中是什麼樣子的。在Python3中,集合是寫在大括號{ }之間,用逗號分隔開的無序不重複序列。需要注意的是集合的兩個特性:無序和不重複,這跟我們之前學過的資料型別有很大不同, ( ^_^ ),說了這麼多,大家都餓了吧,服務員,上程式碼。

Python“六君子”之Set

如上圖所示,我們定義了一個水果的集合fruit,看大家比較餓了,蘇蘇還特意多加了一個‘apple’和‘orange’,不過這顯然是徒勞的,因為集合中不允許有重複元素;同樣由於集合是無序的,所以透過fruit[0]語句獲取集合的第一個元素也不行。

驗證了集合的兩大特性,還記得集合有哪些操作嗎?交集、並集、差集、異或、包含與被包含等等,那麼相對應的,大家還記得怎麼在Python中檢視一個型別的內建方法嗎?是help()函式,對!

Python“六君子”之Set

接下來,我們就一起分析一下Python中Set所特有的方法,首先是求交集。

Python“六君子”之Set

求交集採用的是__add__和__iadd__方法,之前筆者在《Python“六君子”之List》中提到過__add__和__iadd__方法的區別,在此就不重複了,需要大家注意的是set內建__iadd__方法,也就說明了set是可變資料型別。

為了節約空間,蘇蘇將並集、差集、異或放到同一張圖裡表示。

Python“六君子”之Set

set還有一些非常有趣的操作,我們繼續看。

Python“六君子”之Set

clear()用於刪除集合中的所有元素。

Python“六君子”之Set

discard()和remove()均用於刪除集合中的某個元素,區別是當該元素不存在時,discard()函式do nothing,而remove()函式會引發異常;pop()函式移除集合中的任意元素,並將該元素返回,當集合為空時會引發異常。

ok,講了這麼多,居然誤了一個重要知識點,子集sub set和超集super set,Python3中有相應的方法判斷一個集合是否是另一個集合的子集或超集。

Python“六君子”之Set

另外,不知道大家還記得否,列表的元素可以是列表,那麼集合的元素可以是集合或列表嗎?大家先試試?待會兒我再給出解釋。

Python“六君子”之Set

什麼情況呢?集合的元素可以是字串、數字或元祖,卻不可以是列表或集合,並且報出了相同的錯誤TypeError:unhashable type,查閱文件發現,str、int、tuple都有__hash__這個方法,而list和set卻沒有,繼續探尋,找到了答案,官方文件上有這樣一句話:An object is hashable if it has a hash value which never changes during its lifetime,什麼意思呢?如果一個物件在其生命週期的雜湊值都是不變的,則該物件是可雜湊的。因此,在Python3中所有內建的不可變物件都是hashable,而可變物件是unhashable。列表和集合都是可變型別,所以無法作為集合的元素。其實這也好理解,在我們平時生活中,一個集合就是一個集體或組織,如果一個元素可以變的和剛加入集合時不一樣,豈不是很危險的事情。人類世界或許這種情況還真的存在,但計算機的世界是程式設計師的聖地,當然不允許這種不合規矩的情況出現了,( ^_^ ),扯遠了。

回到本次講解,今天真是乾貨滿滿啊,希望初學者可以把上面的程式碼都自己敲一遍以加深印象。OK,又到說再見的時候了,蘇蘇要為鐵粉們準備接下來的程式設計大宴去了,敬請大家享用

Top