Python基本語法_集合set/frozenset_內建方法詳解

發表於2017-04-07

前言

集合是一種組合型的資料型別,分為可變的set和不可變的frozenset。

軟體環境

  • 系統
    • UbuntuKylin 14.04
  • 軟體
    • Python 2.7.3
    • IPython 4.0.0

可變集合Set

集合set是一種無序的、唯一的的元素集,與數學中集合的概念類似,可對其進行交、並、差、補等邏輯運算。不支援索引、切片等序列操作,但仍支援成員關係運算子in-not in、推導式等操作。在特定的場合中可以體現出非常優秀的執行效率。

set()函式建立集合

set(iterable) -> new set object
其中iterable可以是List、Tuple、Dictionary。但是為dict時,只會獲取提Key作為set的元素。

注意:set()函式只能接受迭代器(String、Tuple、List、Dict、set)作為引數。

傳遞一個非迭代器引數時會報錯。

建立空集合

set() -> new empty set object
通過上面的例子,可見set型別資料和dict型別一樣也是使用{}來標識,但是需要注意的是:dict型別可以使用dic = {}來建立一個空字典,set型別卻不能,只能通過s = set()來建立。

注意:因為set()是一個可變的集合,其元素的數量是不固定的,所以有add()、remove()方法。但也因為其可變性所以set()型別的物件沒有雜湊值(雜湊值),同時也不能作為dict物件的key和其他set物件的元素。
雜湊值:將長度不一的輸入資料來源,通過演算法轉換為長度一致的資料輸出,以此來提高查詢速度。
MD5:對檔案或者資料來源(字串、數值)進行計算後得到一個固定的值,用來驗證檔案或資料來源是否被篡改。一般用於檔案的數字簽名。

集合元素的唯一性

無論是set還是frozenset中的元素都是唯一的,會自動合併重疊元素。

集合推導式

由一個迭代器推倒出一個新的集合。

set型別物件的內建方法

add()增加一個元素

add(…)
Add an element to a set.
This has no effect if the element is already present.
增加一個元素到set物件中,如果這個元素已經存在,則沒有效果。

remove()刪除一個元素

remove(…)
Remove an element from a set; it must be a member.
If the element is not a member, raise a KeyError.
指定刪除set物件中的一個元素,如果集合中沒有這個元素,則返回一個錯誤。

一次只能刪除i個元素。

pop()隨機刪除並返回一個元素

pop(…)
Remove and return an arbitrary set element.
Raises KeyError if the set is empty.
隨機刪除並返回一個集合中的元素,若集合為空,則返回一個錯誤。

discard()刪除一個元素

discard(…)
Remove an element from a set if it is a member.
If the element is not a member, do nothing.
指定刪除集合中的一個元素,若沒有這個元素,則do nothing。

clear()

clear(…)
Remove all elements from this set.
清空一個集合中的所有元素

注意:上面列出的函式都是可變型別set物件獨有的函式,除此之外還有一些set和frozenset共有的內建函式,我們後面再介紹。

不可變集合Frozenset

frozenset凍結集合,即不可變集合。frozenset的元素是固定的,一旦建立後就無法增加、刪除和修改。其最大的優點是使用hash演算法實現,所以執行速度快,而且frozenset可以作為dict字典的Key,也可以成為其他集合的元素。

frozenset()建立一個frozenset集合

frozenset(object)
frozenset() -> empty frozenset object
frozenset(iterable) -> frozenset object
Build an immutable unordered collection of unique elements.
建立的固定的無序集合

set能夠與frozenset作比較

set和frozenset的混合運算

兩種型別集合之間的混合運算會返回第一個操作元素的型別。

frozenset集合作為dic的key

set集合不可以作為Dictionary的Key:

set、frozenset共有的內建函式

set與frozenset型別的集合都支援集合之間的比較、交、並、差操作,類似資料的集合關係比較。但是需要注意的是:因為frozenset是不可變集合,所以下列函式中帶有’_update’關鍵字的函式,frozenset都不可以呼叫。
NOTE: 帶有 _update 的函式,使用原位操作的方法實現,擁有更低的資源消耗。但是這樣的話,函式是沒有返回值的,即不能將結果賦值給一個新的變數。

intersection()、intersection_update()求交集

intersection(…)
Return the intersection of two or more sets as a new set.
返回一個由若干個集合經過交集運算後得到的新交集,可以傳入多個迭代器型別的引數。即可以傳遞Tuple、List、、String、Dictionary、Set等型別引數。

集合之間求交集

注意:也可以使用邏輯與運算子 ‘&’

集合和列表求交集

集合和元組求交集

集合和字串求交集

注意:只能以String中的字元進行相交運算,不能與String的數字做運算。

集合和字典求交集

注意:只能與字典中的Key進行相交運算。

intersection()與intersection_update()的區別

intersection_update(…)
Update a set with the intersection of itself and another.
更新一個經過相交後的集合給自己。
注意:當我們希望將兩個物件相交後的結果更新給其中一個操作物件時,建議使用intersection_update()函式,這個函式使用原位操作的方法實現,擁有更低的資源消耗。但是intersection_update()函式是沒有返回值的,即不能將結果賦值給一個新的變數。

union()、update()求並集

與intersection()一樣,可以傳遞不同的迭代器型別引數。

union() 返回並集

union(…)
Return the union of sets as a new set.

注意:可以使用邏輯或運算子 ‘|’

update()更新並集

update(…)
Update a set with the union of itself and others.
update()方法沒有返回值。

difference()、difference_update()求差

difference()

difference(…)
Return the difference of two or more sets as a new set.
返回由一個集合中不存在於其他若干個集合的元素組成的新集合。

注意:可以使用算術運算子減 ‘-‘

difference_update()

difference_update(…)
Remove all elements of another set from this set.
更新原來集合。

symmetric_difference()、symmetric_difference_update()求集合彼此之差的並集

symmetric_difference()

symmetric_difference(…)
Return the symmetric difference of two sets as a new set.
即返回(set1 – set2)|(set2 – set1)的結果

等效於:

注意:可以使用^來代替

symmetric_difference_update()

symmetric_difference_update(…)
Update a set with the symmetric difference of itself and another.

集合間的關係

相等:只有每一個一個set都互相是另一個set的子集時,這兩個set才相等。
小於(set1包含於set2):只有當第一個set1是另一個set2的子集,別且兩個set不相等時,第一個set1小於第二個set2。
大於(set1包含set2):只有第一個set1是第二個set2的超集、並且兩者不相等時,第一個set2大於第二個set2。

isdisjoint()兩個集合不相交

isdisjoint(…)
Return True if two sets have a null intersection.
即set1 & set2 == set() 時,為True

issuperset()一個集合包含另一個集合

issuperset(…)
Report whether this set contains another set.

s2大於s1

issubset()一個集合包含於另一個集合

issubset(…)
Report whether another set contains this set.

s1被s2包含

集合的資料型別轉換

主要轉換為序列型別。

最後

集合是一個非常有意思的資料結構,他或許不被經常使用,但是在比較嚴格的執行環境下,集合是一個非常好的選擇。

請使用手機”掃一掃”x

相關文章