1. 程式人生 > 實用技巧 >Python 集合(Set)

Python 集合(Set)

Python 中集合和字典的形式相似,可以看作只有鍵值的字典。

儲存方式:

  以Hash表進行儲存,典型的以空間換時間的策略。

定義方式:

  空字典:d = {}或者 d = set()

  帶初始值:d = {‘a’, 'b':}

特性:

  (1)集合為可變型別,其內部元素可動態修改(增刪改)

  (2)如果key值重複,後面的資料將覆蓋前面的資料。

  (3)Python中所有的型別都能進行結合儲存,因為Python中一切皆物件,所有物件都有預設的hash演算法和比較演算法

  (4)Python 中非基礎型別的物件作為key時,將根據物件的地址進行hash和比較執行。

  (5)支援常用內建方法(cmp, len, str)等

  (6)集合更像數學容器,支援並集,交集等運算

集合的數學運算:

d1 = {1, 2, 3}
d2 = {2, 3, 4, 5}
d1.union(d2) # 並集 {1, 2, 3, 4, 5}
d1.intersection(d2) # 交集 {2, 3}
d1.symmetric_difference(d2) # 差集{1, 4, 5}
d1.difference(d2) # 差集(d1存在,d2不存在){1}
d2.difference(d1) # 差集(d2存在,d1不存在){4, 5}

d1 & d2 # 交集, 同intersection {2, 3}
d1 | d2 # 並集,同union {1, 2, 3, 4, 5}

常用方法:

d1 = {1, 2, 3}  
d1.add(4) # 給集合新增一個元素
d1.remove(1) # 刪除元素1
d1.pop() # 刪除最後一個元素
d1.update({2, 3, 4}) # 用{2,3,4}更新集合,結果為d1 = {2,3, 4}

d1.copy() # 淺拷貝一份d1

自定義Hash

Python 非基礎型別的hash和比較演算法是基於例項的地址進行計算的,對於自定義類,每個例項物件都將成員其一個元素。

現在我需要通過x值進行比較,如果x值相同則認為兩個例項相同,怎麼實現?

答:過載類的__hash__演算法和__eq__(或者__cmp__)演算法即可。