python的內置類型(3)---字典和集合

1. 字典集合簡介

  • 字典是一系列無序元素的組合,其長度大小可變,元素可以任意地刪減和改變。這裏的元素,是一對鍵(key)和值(value)的配對。
  • 相比於列表和元組,字典的性能更優,特別是對於查找、添加和刪除操作,字典都能在常數時間複雜度內完成。
  • 而集合和字典基本相同,唯一的區別,就是集合沒有鍵和值的配對,是一系列無序的、唯一的元素組合。
  • 集合並不支持索引操作,因爲集合本質上是一個哈希表,和列表不一樣

2. 字典常用的內置函數

方法 說明
dict代表字典對象
dict.clear() 清空字典
dict.pop(key) 移除鍵,同時返回此鍵所對應的值(字典是無序的,隨機移除,慎用)
dict.copy() 返回字典D的副本,只複製一層(淺拷貝)
dict.update(D2) 將字典 D2 合併到D中,如果鍵相同,則此鍵的值取D2的值作爲新值
dict.get(key, default=None) 返回鍵key所對應的值,如果沒有此鍵,則返回default
dict.keys() 返回可迭代的 dict_keys 集合對象
dict.values() 返回可迭代的 dict_values 值對象
dict.items() 返回可迭代的 dict_items 對象

3. 集合常用的內置函數

方法 說明
S表示集合對象
S.add(e) 在集合中添加一個新的元素e;如果元素已經存在,則不添加
S.remove(e) 從集合中刪除一個元素,如果元素不存在於集合中,則會產生一個KeyError錯誤
S.discard(e) 從集合S中移除一個元素e,在元素e不存在時什麼都不做;
S.clear() 清空集合內的所有元素
S.copy() 將集合進行一次淺拷貝
S.pop() 從集合S中刪除一個隨機元素;如果此集合爲空,則引發KeyError異常
S.update(s2) 等同於 S l= s2, 用 S與s2得到的全集更新變量S
S.difference(s2) S - s2 補集運算,返回存在於在S中,但不在s2中的所有元素的集合
S.difference_update(s2) 等同於 S -= s2
S.intersection(s2) 等同於 S & s2
S.intersection_update(s2) 等同於S &= s2
S.isdisjoint(s2) 如果S與s2交集爲空返回True,非空則返回False
S.issubset(s2) 如果S與s2交集爲非空返回True,空則返回False
S.issuperset(…) 如果S爲s2的超集返回True,否則返回False
S.symmetric_difference(s2) 返回對稱補集, 等同於 S ^ s2
S.symmetric_difference_update(s2) 等同於 S ^= s2, 用 S 與 s2 的對稱補集更新 S
S.union(s2) 生成 S 與 s2的全集, 等同於 S += S2

4. 字典的排序

可以參考我的另一篇文章:
python中sort排序與sorted排序(列表 字典排序)

5. 插入 查找 刪除操作

  • 插入操作
    每次向字典或集合插入一個元素時,Python會首先計算鍵的哈希值(hash(key)),再和 mask =PyDicMinSize - 1做與操作,計算這個元素應該插入哈希表的位置index = hash(key) & mask。如果哈希表中此位置是空的,那麼這個元素就會被插入其中。而如果此位置已被佔用,Python便會比較兩個元素的哈希值和鍵是否相等。若兩者都相等,則表明這個元素已經存在,如果值不同,則更新值。若兩者中有一個不相等,這種情況我們通常稱爲哈希衝突(hash collision),意思是兩個元素的鍵不相等,但是哈希值相等。這種情況下,Python便會繼續尋找表中空餘的位置,直到找到位置爲止。
    值得一提的是,通常來說,遇到這種情況,最簡單的方式是線性尋找,即從這個位置開始,挨個往後尋找空位。當然,Python內部對此進行了優化讓這個步驟更加高效。
  • 查找操作
    查找操作和前面的插入操作類似,Python會根據哈希值,找到其應該處於的位置;然後,比較哈希表這個位置中元素的哈希值和鍵,與需要查找的元素是否相等。如果相等,則直接返回;如果不等,則繼續查找,直到找到空位或者拋出異常爲止。
  • 刪除操作
    刪除操作對於刪除操作,Python會暫時對這個位置的元素,賦於一個特殊的值,等到重新調整哈希表的大小時,再將其刪除。不難理解,哈希衝突的發生,往往會降低字典和集合操作的速度。因此,爲了保證其高效性,字典和集合內的哈希表,通常會保證其至少留有1/3的剩餘空間。隨着元素的不停插入,當剩餘空間小於1/3時,Python會重新獲取更大的內存空間,擴充哈希表。不過,這種情況下,表內所有的元素位置都會被重新排放。雖然哈希衝突和哈希表大小的調整,都會導致速度減緩,但是這種情況發生的次數極少。所以,平均情況下,這仍能保證插入、查找和刪除的時間複雜度爲O(1)。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章