天天看點

python集合類型_Python對象類型之集合

intumu.com:機器學習(ML)、人工智能(AI)和土木工程的(TM)關系?​zhuanlan.zhihu.com

python集合類型_Python對象類型之集合

前言

着手開始寫的時候就一直有一個畫面在腦子中出現:小豬佩奇第N級,豬爸爸拿出來一本《混凝土的故事》,打開書的時候說道:混凝土是由砂子、水、水泥組成的,結果其他人都睡着了。于是,我在想,要是給土木人講:python萬法皆對象,對象類型有:數字:int,long,float,complex,bool

字元:str,unicod

清單:list

字典:dict

元組:tuple

檔案:file

其他類型:集合(set),當機集合(frozenset),類類型等。

是不是也有人睡着?相反,如果我直接說砂子、水泥、鋼筋、混凝土,是不是覺得親切?是以接下來将會從一磚一瓦的建築材料說Python。

萬法皆對象:在基建領域,你所看到的構築物就是有以上提到的基礎建材組成;在Python領域對象類型就可以看做基礎建築材料,然後由不同的施工工藝産生不同的單體子產品或構造物。例如:一個函數(施工工藝)所包含的參數(基礎建材),形成一個僞代碼。

僞代碼

#圍牆條形基礎開挖

變量類型:鏟子、䦆頭、羊角碾、塊石、磚頭、水泥、混凝土

#工藝流程:

開挖條形基坑

夯實基礎

抛填塊片石

混凝土填充找平

砌磚

#以上即為面向過程程式設計,下面先說說數字類型。

真代碼

集合

之前看到的清單和字元串都是一種有序序列,而集合 set 是一種無序的序列。

因為集合是無序的,是以當集合中存在兩個同樣的元素的時候,Python隻會儲存其中的一個(唯一性);同時為了確定其中不包含同樣的元素,集合中放入的元素隻能是不可變的對象(确定性)。

集合生成

可以用set()函數來顯示的生成空集合:

a = set()

type(a)

set

也可以使用一個清單來初始化一個集合:

a = set([1, 2, 3, 1])

a

{1, 2, 3}

集合會自動去除重複元素 1。

可以看到,集合中的元素是用大括号{}包含起來的,這意味着可以用{}的形式來建立集合:

a = {1, 2, 3, 1}

a

{1, 2, 3}

但是建立空集合的時候隻能用set來建立,因為在Python中{}建立的是一個空的字典:

s = {}

type(s)

dict

集合操作

假設有這樣兩個集合:

a = {1, 2, 3, 4}

b = {3, 4, 5, 6}

兩個集合的并,傳回包含兩個集合所有元素的集合(去除重複)。

可以用方法 a.union(b) 或者操作 a | b 實作。

a.union(b)

{1, 2, 3, 4, 5, 6}

b.union(a)

{1, 2, 3, 4, 5, 6}

a | b

{1, 2, 3, 4, 5, 6}

兩個集合的交,傳回包含兩個集合共有元素的集合。

可以用方法 a.intersection(b) 或者操作 a & b 實作。

a.intersection(b)

{3, 4}

b.intersection(a)

{3, 4}

a & b

{3, 4}

print(a & b)

set([3, 4])

注意:一般使用print列印set的結果與表示方法并不一緻。

a 和 b 的差集,傳回隻在 a 不在 b 的元素組成的集合。

可以用方法 a.difference(b) 或者操作 a - b 實作。

a.difference(b)

{1, 2}

a - b

{1, 2}

注意,a - b 與 b - a并不一樣,b - a 傳回的是傳回 b 不在 a 的元素組成的集合:

b.difference(a)

{5, 6}

b - a

{5, 6}

對稱差

a 和b 的對稱差集,傳回在 a 或在 b 中,但是不同時在 a 和 b 中的元素組成的集合。

可以用方法 a.symmetric_difference(b) 或者操作 a ^ b 實作(異或操作符)。

a.symmetric_difference(b)

{1, 2, 5, 6}

b.symmetric_difference(a)

{1, 2, 5, 6}

a ^ b

{1, 2, 5, 6}

包含關系

假設現在有這樣兩個集合:

a = {1, 2, 3}

b = {1, 2}

要判斷 b 是不是 a 的子集,可以用 b.issubset(a) 方法,或者更簡單的用操作 b <= a :

b.issubset(a)

True

b <= a

True

與之對應,也可以用 a.issuperset(b) 或者 a >= b 來判斷:

a.issuperset(b)

True

a >= b

True

方法隻能用來測試子集,但是操作符可以用來判斷真子集:

a <= a

True

自己不是自己的真子集:

a < a

False

集合方法

add 方法向集合添加單個元素

跟清單的 append 方法類似,用來向集合添加單個元素。

s.add(a)

将元素 a 加入集合 s 中。

t = {1, 2, 3}

t.add(5)

t

{1, 2, 3, 5}

如果添加的是已有元素,集合不改變:

t.add(3)

t

{1, 2, 3, 5}

update 方法向集合添加多個元素

跟清單的extend方法類似,用來向集合添加多個元素。

s.update(seq)

将seq中的元素添加到s中。

t.update([5, 6, 7])

t

{1, 2, 3, 5, 6, 7}

remove 方法移除單個元素

s.remove(ob)

從集合s中移除元素ob,如果不存在會報錯。

t.remove(1)

t

{2, 3, 5, 6, 7}

t.remove(10)

---------------------------------------------------------------------------

KeyError Traceback (most recent call last)

in ()

----> 1 t.remove(10)

KeyError: 10

pop方法彈出元素

由于集合沒有順序,不能像清單一樣按照位置彈出元素,是以pop 方法删除并傳回集合中任意一個元素,如果集合中沒有元素會報錯。

t.pop()

{3, 5, 6, 7}

print(t)

set([3, 5, 6, 7])

s = set()

# 報錯

s.pop()

---------------------------------------------------------------------------

KeyError Traceback (most recent call last)

in ()

1 s = set()

2 # 報錯

----> 3 s.pop()

KeyError: 'pop from an empty set'

discard 方法

作用與 remove 一樣,但是當元素在集合中不存在的時候不會報錯。

t.discard(3)

t

{5, 6, 7}

不存在的元素不會報錯:

t.discard(20)

t

{5, 6, 7}

difference_update方法

a.difference_update(b)

從a中去除所有屬于b的元素:

土木狗的視角:集合大體上是清單+字典+元組的變種!集合是無序的,是以當集合中存在兩個同樣的元素的時候,Python隻會儲存其中的一個(唯一性);同時為了確定其中不包含同樣的元素,集合中放入的元素隻能是不可變的對象(确定性)。這個特性往往可以用在處理清單的重複資料,比如一個含有重複資料的listA,可以通過list(set(listA))進行強制轉換類型,進而實作去重。

課後作業(可選)

按上一節運作自己的項目,建立一個*.ipynb檔案,将上面代碼敲入運作。

intumu.com:Python資料分析及可視化執行個體目錄​zhuanlan.zhihu.com

python集合類型_Python對象類型之集合