python字典

1. 簡介

只有可散列的數據類型才能作為字典的鍵,原子不可變數據類型(str、bytes 和數值類型)都是可散列類型,frozenset 也是
可散列的,因為根據其定義,frozenset 里只能容納可散列類型。

a = dict(one=1,two=2,three=3)

b = {'one':1,'two':2,'three':3}

set1 = {'one','two','three'}

set2 = {1,2,3}

c = dict(zip(set1,set2))   # zip() 函數的返回結果為 [('one', 1), ('three', 3), ('two', 2)] type is list

d = dict({'three':3,'one':1,'two':2})

a == b == c == d   # 返回值True

除了這些字面句法和靈活的構造方法之外,字典推導(dict comprehension)也可以用來建造新 dict.

2.字典推導式

image.png

3.字典上可進行的操作

len(a)                        # 返回字典長度
a[key]                       # 返回字段key值為key的元素值,如果key 不在 字典中,報KeyError。
a[key] = value           # 設置a[key] 的值為value
iter(a)                        # 返回一個迭代器,元素由字典所有的鍵組成
key in a // key not in a   # a 中key 存在返回True,否則False// 相反,存在返回False,不存在返回True
e = a.copy()                 # 淺拷貝
f = fromkeys(seq[, value])         # 以seq為鍵值創建一個新的字典,values設置為value 該方法為字典類的方法
f = a.fromkeys(set1,None)       # 返回以set1元素為key值的 None為鍵值的字典 :{1: None, 2: None, 3: None}
value1 = get(key[,default])       # 如果key存在,返回key的值否則,返回default的值,default 默認為None.
element_list = items()              # 返回以鍵值對為元素的列表。[(key,value),....]
ele_iter  = iteritems()                 #返回以鍵值對為元素的迭代器。
iterkey() /// itervalues()           #........
keys()      ///value()                 # 返回一個列表,元素為字典的鍵/////值
pop(key[, default]) # 如果key 在字典中移除,并返回他的值,如果給出default,返回default。如果default未給,并且key不在字典中,報KeyError.
popitem()                   # 移除并返回任意鍵值對。
setdefault(key[, default])   # 如果key 在字典中,返回他的值,如果不在,插入到字典中,鍵為key,值為default 并返回default,default默認為None
update([other])                 # 更新一個字典,加入other中的鍵值對。
a.update({'four':4})            # a =   {'three': 3, 'two': 1, 'one': 1,'four':4}

4. defaultdict:處理找不到的鍵的一個選擇

創建 defaultdict 對象的時候,就需要給它配置一個為找不到的鍵創造默認值的方法。具體而言,在實例化一個 defaultdict 的時候,需要給構造方法提供一個可調用對象,這個可調用對象會在 getitem 碰到找不到的鍵的時候被調用,讓 getitem
回某種默認值。比如,我們新建了這樣一個字典:
dd = defaultdict(list),如果鍵 'new-key' 在 dd中還不存在的話,表達式 dd['new-key'] 會按照以下的步驟來行事

    1. 調用 list() 來建立一個新列表。
  • 2 把這個新列表作為值,'new-key' 作為它的鍵,放到 dd 中。
  • 3 返回這個列表的引用。
import collections
dd = collections.defaultdict(list)
print dd['zhao']      #輸出值為[]
pring dd                # defaultdict(<type 'list'>, { 'zhao': []})

上述例子中,

1.使用list作為default_factory 來創建一個defaultdict,它是用來生產默認值的可調用對象。
2.如果創建defaultdict的時候沒有指定default_factory,查詢不存在的鍵會觸發KeyError.
3.defaultdict里面的default-factory只會在_getitem_里面被調用,在其他方法里面完全不會發揮作用。比如,上面例子中,dd['zhao']會調用default_factory,但是,dd.get('xxx')不回調用,而是返回None.

而這個用來生成默認值的可調用對象存放在名為 default_factory 的實例屬性里.如果在創建 defaultdict 的時候沒有指定default_factory,查詢不存在的鍵會觸發KeyError.所有這一切背后的功臣其實是特殊方法 missing。它會在 defaultdict 遇到找不到的鍵的時候調用 default_factory,而實際上這個特性是所有映射類型都可以選擇去支持的。

5.字典的變種

5.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)]

5.2.collections.OrderedDict

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

5.3.collections.ChainMap

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

5.4.colllections.UserDict

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

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

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

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

推薦閱讀更多精彩內容

  • 一、字典基本操作 基本語法:dict = {'ob1':'computer', 'ob2':'mouse', 'o...
    古佛青燈度流年閱讀 2,668評論 0 1
  • 1 字典基礎操作 1.1 創建字典 通過{}操作符創建字典aDict = {'name':'ke', 'age':...
    Ke爺閱讀 597評論 0 0
  • 本篇將介紹Python里面的字典,更多內容請參考:Python學習指南 Python是什么? Python內置了字...
    小七奇奇閱讀 1,458評論 0 5
  • 學習了 Python 基本的字典操作后,學習這些進階操作,讓寫出的代碼更加優雅簡潔和 pythonic 。 與字...
    追夢人物閱讀 12,864評論 10 70
  • 1. 字典的一些知識點 字典特性可變、可存儲任意類型對象、無序 字典的生成?直接用dict 字典的排序?sorte...
    海螺上的斑點閱讀 423評論 0 0