引言
集合是元素唯一的無序集合。它是電腦科學中最核心的資料結構之一。像其他程式語言一樣,python也具有集合及其操作函式的內建實現。
1.了解集合的基本特徵
python中集合的性質由數學中的集合論決定。其基本特徵如下:
·集合中的元素是無序的
·集合不能包含重複的元素
·集合上有3種基本運算: 並運算、交運算和補運算
因此,python中的集合只能包含不可變的物件,重複的元素將被刪除。
s =
print(s) # duplicate numbers were removed
# s = # tuple is an immutable type
print(s)
# s = # can't contain a mutable type
# typeerror: unhashable type: 'list'
如上所述,集合將丟棄重複的數字,即使我們定義了它們。
另一方面,不可變型別的元組可以是集合的元素,但可變型別的列表則不能。否則將引發typeerror。
順便說一句,使用集合是刪除列表中重複項的常用方法。
leaders = ["yang zhou", "elon mask", "yang zhou"]
unique_leaders = list(set(leaders))
print(unique_leaders)
# ['yang zhou', 'elon mask']
2.三種方法建立集合有三種方法可以在python中建立集合:
直接用大括號定義
>>> s =
>>> type(s)
這是定義set物件的一種直觀方法。正如前面提到的,如果有一些重複的元素,那麼就會丟棄它們。
使用set方法
>>> s = set([1,2,3,4])
>>> type(s)
這個方法最多只能接收乙個引數,這個引數必須是可迭代的。如果沒有引數,將生成乙個新的空集。
·set(): 獲取乙個新的空 set 物件
·set(iterable): 獲取乙個新集合,該集合的元素來自可迭代物件
任何迭代都可以用來生成乙個 set 物件。當使用字典時,我們應該注意它的鍵或值是否會被應用。
d =
s = set(d) # use its keys by default
print(s)
# s2 = set(d.values())
print(s2)
#
使用集合解析這是一種生成集合的優雅方式:
s =
print(s)
#
3.巧妙地修改集合建立集合後,我們可以使用內建函式對其進行修改。常用方法如下:
·add():向集合中新增乙個元素。如果已經包含該元素,則沒有效果
·remove():刪除乙個元素。如果元素不是成員,將引發乙個keyerror。
·pop():刪除並返回乙個任意元素。如果集合為空,將引發keyerror。
·discard():丟棄元素。如果元素不是成員,則無效。
·clear():丟棄集合中的所有元素
s =
s.add(9)
print(s)
# s.remove(1)
print(s)
# s.discard(100) # no effect
print(s)
# s.discard(9)
print(s)
# s.pop()
print(s)
# s.clear()
print(s)
# set()
# s.remove(100)
# keyerror: 100
4.掌握集合的運算如上所述,集合上有3種基本操作:並集,交集和補集。它們可以通過維恩圖進行演示,如下所示:
我們可以通過python集合中的內建運算子或方法來實現它們。
獲得多個集合的並集
集a和集b的並集定義為乙個新集,它由屬於集a或集b(或兩者)的所有元素組成。
有3種方法可以得到兩個集合的並集:
a =
b =
c = a.union(b)
print(c, a, b)
#
c = a | b
print(c, a, b)
#
a.update(b)
print(a, b)
#
如上所示,我們可以使用|運算子,union()或update()方法來獲取聯合集。區別如下:
·union()函式或|運算子返回乙個新的並集,並且不會對集合a產生影響
·update()函式不返回任何內容,而是在集合a上進行更改。
d = a.union(b, c)
a.update(b, c)
d = a | b | c
得到多個集合的交集集a和集b的交集定義為乙個集合,該集合由同時屬於a和b的所有元素組成。
與並集類似,也有三種計算交集的方法:
a =
b =
c = a.interp(b)
print(c, a, b)
#
c = a & b
print(c, a, b)
#
a.interp_update(b)
print(a, b)
#
得到集合的補集和差值數學集合論中對補和差的定義如下:
集合a的補集是乙個集合,其所有元素都在給定的總集合u中,但不在集合a中。
集合a和集合b的相對補或差是乙個集合,其所有元素都在a中,但不在b中。
簡而言之,總集合是包含集合a的更大集合。因此,補集和差值操作本質上是相同的。唯一的區別是:
·補集是針對乙個集合(集合a的補集)
·差值是針對多個集合(集合a和集合b的差值)
python同樣提供了三種方法來獲得補集或差值:
a =
b =
c = a.difference(b)
print(c, a, b)
#
c = a - b
print(c, a, b)
#
a.difference_update(b)
print(a, b)
#
5.正確使用凍結集正如元組是不可變的列表,凍結的集合也是不可變的集合。python 以這種方式定義它的資料結構,給我們更多的靈活性。雖然這看起來不常見,但有時我們確實需要使用集合的不可變版本。
例如,如果我們想使用集合作為字典的鍵:
frozen_s1 = frozenset()
frozen_s2 = frozenset()
d =
print(d)
# ): 'yang', frozenset(): 'zhou'}
s1 =
s2 =
d =
# typeerror: unhashable type: 'set'
如上所述,我們可以使用不可變的凍結集而不是普通集合作為字典的鍵。
由於凍結集是不可變的,因此無法使用3中提到的方法來修改凍結集。
frozen_s1 = frozenset()
frozen_s1.add(4)
# attributeerror: 'frozenset' object has no attribute 'add'
總結集合不僅僅是數學中的重要概念,在電腦科學中同樣重要,由於它的特殊性,我們應該熟練掌握並應用它。
幾種在併發程式設計中使用的集合
不可變集合 不會經常修改,可以被多個執行緒安全訪問的集合。特點 不可變集合的乙個例項是永遠不改變的。因為不會改變,所以絕對是執行緒安全的 對不可變集合使用修改方法時,返回修改後的集合 例子 var dictionary immutabledictionary.empty dictionary dic...
8 1 3 在 C 中使用函式集合
8.1.3 在 c 中使用函式集合 考慮戶貸款端時,我們想要執行所有測試,並統計返回 true 的測試數 指高風險 如果數量為零個或一,程式將建議貸款。正常的命令式解決方案是,宣告乙個變數,使用 foreach 語句列舉測試。在迴圈中體,執行測試,如果它返回 true,就增加變數。這可以更優雅地實現...
在python中使用websocket
介紹一款很帥的外掛程式autobahnpython,通過它可以在python中很方便的使用websocket進行通訊 基於twisted框架 這個外掛程式真正強大的地方是它提供了乙個 發布 訂閱模式,具體內容有空再寫,先簡單介紹一下如何建立傳統的連線。建立伺服器 必須的模組 from twisted...