在 Python 中使用集合的5個層次

2021-10-22 02:30:02 字數 4689 閱讀 9608

引言

集合是元素唯一的無序集合。它是電腦科學中最核心的資料結構之一。像其他程式語言一樣,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...