python 中字典的變種

1.collections.Counter

這個映射類型會給鍵準備一個整數計數器。每次更新一個鍵的時候都會增加這個計數器。所以這個類型可以用來給可散列表對象計數,或者是當成多重集來用——多重集合就是集合里的元素可以出現不止一次。Counter 實現了 + 和 - 運算符用來合并記錄,還有像 most_common([n]) 這類很有用的方法。most_common([n]) 會按照次序返回映射里最常見的 n 個鍵和它們的計數。

import collections
ct = collections.Counter(['zhao','zhao','linpeng','peng','peng','peng'])
print ct   #output:Counter({'peng': 3, 'zhao': 2, 'linpeng': 1})
print ct.most_common(2)   # output: [('peng', 3), ('zhao', 2)]

2.collections.OrderedDict

這個類型在添加鍵的時候會保持順序,因此鍵的迭代次序總是一致的。OrderedDict 的 popitem 方法默認刪除并返回的是字典里的最后一個元素,但是如果像 my_odict.popitem(last=False) 這樣調用它,那么它刪除并返回第一個被添加進去的元素。

3.collections.ChainMap

該類型可以容納數個不同的映射對象,然后在進行鍵查找操作的時候,這些對象會被當作一個整體被逐個查找,直到鍵被找到為止。這個功能在給有嵌套作用域的語言做解釋器的時候很有用,可以用一個映射對象來代表一個作用域的上下文。

4.colllections.UserDict

這個類其實就是把標準 dict 用純 Python 又實現了一遍。跟 OrderedDict、ChainMap 和 Counter 這些開箱即用的類型不同,UserDict 是讓用戶繼承寫子類的。更傾向于從 UserDict 而不是從 dict 繼承的主要原因是,后者有時會在某些方法的實現上走一些捷徑,導致我們不得不在它的子類中重寫這些方法,但是 UserDict 就不會帶來這些問題.
??UserDict 并不是 dict 的子類,但是 UserDict 有一個叫作 data 的屬性,是 dict 的實例,這個屬性實際上是 UserDict 最終存儲數據的地方。

5.最后介紹一種不可變映射對象,type 模塊中的MappingProxyType

??types 模塊中引入了一個封裝類名叫 MappingProxyType。如果給這個類一個映射,它會返回一個只讀的映射視圖。雖然是個只讀視圖,但是它是動態的。這意味著如果對原映射做出了改動,我們通過這個視圖可以觀察到,但是無法通過這個視圖對原映射做出修改。

image.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,991評論 19 139
  • 字典這個數據結構活躍在所有 Python 程序的背后, 即便你的源碼里并沒有直接用到它。 3.2 字典推導 3.3...
    時間之友閱讀 545評論 0 0
  • 主要內容源自解讀《Fluent Python》,理解如有錯誤敬請指正:-) dict對象的最原始的接口描述是 co...
    曉風翌日閱讀 4,909評論 0 4
  • 1. 簡介 只有可散列的數據類型才能作為字典的鍵,原子不可變數據類型(str、bytes 和數值類型)都是可散列類...
    第八共同體閱讀 339評論 0 0
  • 煙雨一蓑任平生, 臘梅幾度伴青松。 冽風寒霜猶不懼, 任爾東南西北風。 (清風明月于十一月十二號)
    清風明月馮耀杰閱讀 304評論 2 10