1. 簡介
只有可散列的數(shù)據(jù)類型才能作為字典的鍵咽瓷,原子不可變數(shù)據(jù)類型(str、bytes 和數(shù)值類型)都是可散列類型贸街,frozenset 也是
可散列的庵寞,因為根據(jù)其定義,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() 函數(shù)的返回結(jié)果為 [('one', 1), ('three', 3), ('two', 2)] type is list
d = dict({'three':3,'one':1,'two':2})
a == b == c == d # 返回值True
除了這些字面句法和靈活的構(gòu)造方法之外捐川,字典推導(dict comprehension)也可以用來建造新 dict.
2.字典推導式
3.字典上可進行的操作
len(a) # 返回字典長度
a[key] # 返回字段key值為key的元素值,如果key 不在 字典中逸尖,報KeyError古沥。
a[key] = value # 設(shè)置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為鍵值創(chuàng)建一個新的字典渐白,values設(shè)置為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:處理找不到的鍵的一個選擇
創(chuàng)建 defaultdict 對象的時候趴拧,就需要給它配置一個為找不到的鍵創(chuàng)造默認值的方法溅漾。具體而言,在實例化一個 defaultdict 的時候著榴,需要給構(gòu)造方法提供一個可調(diào)用對象添履,這個可調(diào)用對象會在 getitem 碰到找不到的鍵的時候被調(diào)用,讓 getitem 返
回某種默認值兄渺。比如缝龄,我們新建了這樣一個字典:
dd = defaultdict(list),如果鍵 'new-key' 在 dd中還不存在的話挂谍,表達式 dd['new-key'] 會按照以下的步驟來行事
- 調(diào)用 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 來創(chuàng)建一個defaultdict俺亮,它是用來生產(chǎn)默認值的可調(diào)用對象。
2.如果創(chuàng)建defaultdict的時候沒有指定default_factory疟呐,查詢不存在的鍵會觸發(fā)KeyError.
3.defaultdict里面的default-factory只會在_getitem_里面被調(diào)用脚曾,在其他方法里面完全不會發(fā)揮作用。比如启具,上面例子中本讥,dd['zhao']會調(diào)用default_factory,但是鲁冯,dd.get('xxx')不回調(diào)用拷沸,而是返回None.
而這個用來生成默認值的可調(diào)用對象存放在名為 default_factory 的實例屬性里.如果在創(chuàng)建 defaultdict 的時候沒有指定default_factory,查詢不存在的鍵會觸發(fā)KeyError.所有這一切背后的功臣其實是特殊方法 missing薯演。它會在 defaultdict 遇到找不到的鍵的時候調(diào)用 default_factory撞芍,而實際上這個特性是所有映射類型都可以選擇去支持的。
5.字典的變種
5.1.collections.Counter
這個映射類型會給鍵準備一個整數(shù)計數(shù)器跨扮。每次更新一個鍵的時候都會增加這個計數(shù)器序无。所以這個類型可以用來給可散列表對象計數(shù)验毡,或者是當成多重集來用——多重集合就是集合里的元素可以出現(xiàn)不止一次。Counter 實現(xiàn)了 + 和 - 運算符用來合并記錄愉镰,還有像 most_common([n]) 這類很有用的方法米罚。most_common([n]) 會按照次序返回映射里最常見的 n 個鍵和它們的計數(shù)。
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) 這樣調(diào)用它碗降,那么它刪除并返回第一個被添加進去的元素。
5.3.collections.ChainMap
該類型可以容納數(shù)個不同的映射對象塘秦,然后在進行鍵查找操作的時候讼渊,這些對象會被當作一個整體被逐個查找,直到鍵被找到為止尊剔。這個功能在給有嵌套作用域的語言做解釋器的時候很有用爪幻,可以用一個映射對象來代表一個作用域的上下文。
5.4.colllections.UserDict
這個類其實就是把標準 dict 用純 Python 又實現(xiàn)了一遍须误。跟 OrderedDict挨稿、ChainMap 和 Counter 這些開箱即用的類型不同,UserDict 是讓用戶繼承寫子類的京痢。更傾向于從 UserDict 而不是從 dict 繼承的主要原因是奶甘,后者有時會在某些方法的實現(xiàn)上走一些捷徑,導致我們不得不在它的子類中重寫這些方法祭椰,但是 UserDict 就不會帶來這些問題.
??UserDict 并不是 dict 的子類臭家,但是 UserDict 有一個叫作 data 的屬性,是 dict 的實例方淤,這個屬性實際上是 UserDict 最終存儲數(shù)據(jù)的地方钉赁。
5.5.最后介紹一種不可變映射對象,type 模塊中的MappingProxyType
??types 模塊中引入了一個封裝類名叫 MappingProxyType携茂。如果給這個類一個映射你踩,它會返回一個只讀的映射視圖。雖然是個只讀視圖邑蒋,但是它是動態(tài)的姓蜂。這意味著如果對原映射做出了改動,我們通過這個視圖可以觀察到医吊,但是無法通過這個視圖對原映射做出修改钱慢。