dict | defaultdict | OrderdDict | 方法做用 | |
d.clear() | √ | √ | √ | 移除全部元素 |
d.__contains__(k) | √ | √ | √ | 檢查 k 是否在 d 中 |
d.copy() | √ | √ | √ | 淺複製 |
d.__copy__() | √ | 用於支持 copy.copy | ||
.default_factory | √ | 在 __missing__ 函數中被調用的 |
||
d.__delitem__(k) | √ | √ | √ | del d[k],移除鍵爲 k 的元素 |
d.fromkeys(it, |
√ | √ | √ | 將迭代器 it 裏的元素設置爲映射 |
d.get(k,[default]) | √ | √ | √ | 返回鍵 k 對應的值,若是字典裏 沒有鍵 k,則返回 None 或者 |
d.__getitem__(k) | √ | √ | √ | 讓字典 d 能用 d[k] 的形式返回鍵 |
d.items() | √ | √ | √ | 返回 d 裏全部的鍵值對 |
d.__iter__() | √ | √ | √ | 獲取鍵的迭代器 |
d.keys() | √ | √ | √ | 獲取全部的鍵 |
d.__len__() | √ | √ | √ | 能夠用 len(d) 的形式獲得字典裏 |
d.__missing__(k) | √ | 當 __getitem__ 找不到對應鍵的 |
||
d.move_to_end(k, |
√ | 把鍵爲 k 的元素移動到最靠前或 |
||
d.pop(k, [defaul] | √ | √ | √ | 返回鍵 k 所對應的值,而後移除 |
d.popitem() | √ | √ | √ | 隨機返回一個鍵值對並從字典裏 |
d.__reversed__() | √ | 返回倒序的鍵的迭代器 | ||
d.setdefault(k, |
√ | √ | √ | 若字典裏有鍵k,則把它對應的值 |
d.__setitem__(k, |
√ | √ | √ | 實現 d[k] = v 操做,把 k 對應的 |
d.update(m, |
√ | √ | √ | m 能夠是映射或者鍵值對迭代 |
d.values() | √ | √ | √ | 返回字典裏的全部值 |
注:1.default_factory 並非一個方法,而是一個可調用對象(callable),它的值在defaultdict 初始化的時候由用戶設定。
2.OrderedDict.popitem() 會移除字典裏最早插入的元素(先進先出);同時這個方法還有一個可選的 last 參數,若爲真,則會移除最後插入的元素(後進先出)(而dict和defaultdict則是隨機移除);
3.dict.keys()在Python3中的返回值是一個「視圖」。視圖就像一個集合,並且跟字典相似的是,在視圖裏查找一個元素的速度很快;Python2中返回的是一個列表,查詢慢。
有時候爲了方便起見,就算某個鍵在映射裏不存在,咱們也但願在經過這個鍵讀取值的時候能獲得一個默認值。有兩個途徑能幫咱們達到這個目的,一個是經過 defaultdict 這個類型而不是普通的 dict,另外一個是給本身定義一個 dict 的子類,而後在子類中實現 __missing__ 方法。
步驟:
(1) 調用 list() 來創建一個新列表。
(2) 把這個新列表做爲值,'new-key' 做爲它的鍵,放到 dd 中。
(3) 返回這個列表的引用。而這個用來生成默認值的可調用對象存放在名爲 default_factory 的實例屬性裏。
注:defaultdict 裏的 default_factory 只會在__getitem__ 裏被調用,在其餘的方法裏徹底不會發揮做用。好比,dd 是個 defaultdict,k 是個找不到的鍵, dd[k] 這個表達式會調用 default_factory 創造某個默認值,而 dd.get(k) 則會返回 None。
若是一個類繼承了dict,且實現了__miss__()方法,則在調用__getitem__()方法找不到鍵時(即d["test"]沒有這個鍵)不會直接拋出KeyError。
這個類型在添加鍵的時候會保持順序,所以鍵的迭代次序老是一致的。
該類型能夠容納數個不一樣的映射對象,而後在進行鍵查找操做的時候,這些對象會被看成一個總體被逐個查找,直到鍵被找到爲止。
這個映射類型會給鍵準備一個整數計數器。每次更新一個鍵的時候都會增長這個計數器。通常用作計數。
傾向於從 UserDict 而不是從 dict 繼承的主要緣由是,後者有時會在某些方法的實現上走一些捷徑,致使咱們不得不在它的子類中重寫這些方法,可是 UserDict 就不會帶來這些問題。內置類型的方法不會調用子類覆蓋的方法。例如,dict 的子類覆蓋的 __getitem__() 方法不會被內置類型的get() 方法調用等。
注:
UserDict 並非 dict 的子類,可是UserDict 有一個叫做 data 的屬性,是 dict 的實例,這個屬性其實是 UserDict 最終存儲數據的地方。這樣作的好處是,UserDict 的子類就能在實現 __setitem__ 的時候避免沒必要要的遞歸,也可讓 __contains__ 裏的代碼更簡潔。