dict、defaultdict 和 OrderedDict 比較

一.dict、defaultdict 和 OrderedDict 常見的方法比較

  

dict、defaultdict 和 OrderedDict 常見的方法比較
  dict defaultdict OrderdDict 方法做用
d.clear() 移除全部元素
d.__contains__(k) 檢查 k 是否在 d 中
d.copy() 淺複製
d.__copy__()      用於支持 copy.copy
.default_factory    

在 __missing__ 函數中被調用的
函數,用以給未找到的元素設置
值*ide

d.__delitem__(k) del d[k],移除鍵爲 k 的元素

d.fromkeys(it,
[initial])函數

將迭代器 it 裏的元素設置爲映射
裏的鍵,若是有 initial 參數,
就把它做爲這些鍵對應的值(默
認是 None)spa

 d.get(k,[default]) 返回鍵 k 對應的值,若是字典裏

沒有鍵 k,則返回 None 或者
default對象

d.__getitem__(k)

讓字典 d 能用 d[k] 的形式返回鍵
k 對應的值blog

d.items() 返回 d 裏全部的鍵值對
d.__iter__() 獲取鍵的迭代器
d.keys() 獲取全部的鍵
d.__len__()

能夠用 len(d) 的形式獲得字典裏
鍵值對的數量繼承

d.__missing__(k)    

當 __getitem__ 找不到對應鍵的
時候,這個方法會被調用遞歸

d.move_to_end(k,
[last]ci

   

把鍵爲 k 的元素移動到最靠前或
者最靠後的位置(last 的默認值
是 True)get

d.pop(k, [defaul]

返回鍵 k 所對應的值,而後移除
這個鍵值對。若是沒有這個鍵,
返回 None 或者 defaulit

d.popitem()

隨機返回一個鍵值對並從字典裏
移除它

d.__reversed__()     返回倒序的鍵的迭代器

d.setdefault(k,
[default])

若字典裏有鍵k,則把它對應的值
設置爲 default,而後返回這個
值;若無,則讓 d[k] =default,而後返回 default

d.__setitem__(k,
v)

實現 d[k] = v 操做,把 k 對應的
值設爲v

d.update(m,
[**kargs])

m 能夠是映射或者鍵值對迭代
器,用來更新 d 裏對應的條目

d.values() 返回字典裏的全部值

  注:1.default_factory 並非一個方法,而是一個可調用對象(callable),它的值在defaultdict 初始化的時候由用戶設定。

    2.OrderedDict.popitem() 會移除字典裏最早插入的元素(先進先出);同時這個方法還有一個可選的 last 參數,若爲真,則會移除最後插入的元素(後進先出)(而dict和defaultdict則是隨機移除);

    3.dict.keys()在Python3中的返回值是一個「視圖」。視圖就像一個集合,並且跟字典相似的是,在視圖裏查找一個元素的速度很快;Python2中返回的是一個列表,查詢慢。

二.映射的彈性查詢

  有時候爲了方便起見,就算某個鍵在映射裏不存在,咱們也但願在經過這個鍵讀取值的時候能獲得一個默認值。有兩個途徑能幫咱們達到這個目的,一個是經過 defaultdict 這個類型而不是普通的 dict,另外一個是給本身定義一個 dict 的子類,而後在子類中實現 __missing__ 方法。

  1.collections.defaultdict:

    

    步驟:

      (1) 調用 list() 來創建一個新列表。

      (2) 把這個新列表做爲值,'new-key' 做爲它的鍵,放到 dd 中。

      (3) 返回這個列表的引用。而這個用來生成默認值的可調用對象存放在名爲 default_factory 的實例屬性裏。

    注:defaultdict 裏的 default_factory 只會在__getitem__ 裏被調用,在其餘的方法裏徹底不會發揮做用。好比,dd 是個 defaultdict,k 是個找不到的鍵, dd[k] 這個表達式會調用 default_factory 創造某個默認值,而 dd.get(k) 則會返回 None。

  2.__miss__方法:

    若是一個類繼承了dict,且實現了__miss__()方法,則在調用__getitem__()方法找不到鍵時(即d["test"]沒有這個鍵)不會直接拋出KeyError。

  3.collections.OrderedDict和collections.ChainMap和collections.Counter:

    3.1collections.OrderedDict:

       這個類型在添加鍵的時候會保持順序,所以鍵的迭代次序老是一致的。

    3.2collections.ChainMap:

       該類型能夠容納數個不一樣的映射對象,而後在進行鍵查找操做的時候,這些對象會被看成一個總體被逐個查找,直到鍵被找到爲止。

    3.3collections.Counter:

       這個映射類型會給鍵準備一個整數計數器。每次更新一個鍵的時候都會增長這個計數器。通常用作計數。

  4.若是要自定義映射類型,通常不會直接繼承dict,而是繼承collections.UserDict 類:    

       傾向於從 UserDict 而不是從 dict 繼承的主要緣由是,後者有時會在某些方法的實現上走一些捷徑,致使咱們不得不在它的子類中重寫這些方法,可是 UserDict 就不會帶來這些問題。內置類型的方法不會調用子類覆蓋的方法。例如,dict 的子類覆蓋的 __getitem__() 方法不會被內置類型的get() 方法調用等。

        注:

          UserDict 並非 dict 的子類,可是UserDict 有一個叫做 data 的屬性,是 dict 的實例,這個屬性其實是 UserDict 最終存儲數據的地方。這樣作的好處是,UserDict 的子類就能在實現 __setitem__ 的時候避免沒必要要的遞歸,也可讓 __contains__ 裏的代碼更簡潔。

相關文章
相關標籤/搜索