字典
-
字典中的鍵映射多個值
通常情況下官觅,一個鍵對應(yīng)一個值,如果想要一個鍵對應(yīng)多個值阐污,那么需要將多個值放入其他容器中休涤,如列表、集合笛辟,選擇什么樣的容器功氨,取決的想要保留什么樣的值。列表手幢,能保持插入的順序捷凄,元素可重復(fù);集合围来,無序跺涤,元素唯一性。
?? 一方面可以自己實現(xiàn)监透,另一方面可以使用collections 模塊中的 defaultdict 來構(gòu)造這樣的字典桶错。defaultdict 的一個特征是它會自動初始化每個 key 剛開始對應(yīng)的值,key對應(yīng)的多個值需要什么容器由參數(shù)指定胀蛮。需要注意的是院刁,defaultdict 會自動為將要訪問的鍵 (就算目前字典中并不存在這樣的鍵) 創(chuàng)建映射實體。
?? Defaultdict()不傳參數(shù)粪狼,說明內(nèi)部存儲值的容器默認是key與value是一對一的字典類型
?? Defaultdict(list)傳列表類型退腥,說明內(nèi)部存儲值的容器是list任岸。直接使用append方法給關(guān)鍵字添加值
?? Defaultdict(set)傳集合類型,說明內(nèi)部存儲值的容器是set狡刘。直接使用add方法給關(guān)鍵字添加值
??Defaultdict()除了接受類型參數(shù)外享潜,也可以接受無參數(shù)的調(diào)用函數(shù)
簡單看看defaultdict方法返回結(jié)果
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from collections import defaultdict
default1=defaultdict(set)
print(default1)
#結(jié)果
>>defaultdict(<type 'set'>, {})
default1['a'].add(1)
default1['a'].add(1)
default1['a'].add(2)
print(default1)
#結(jié)果
>>defaultdict(<type 'set'>, {'a': set([1, 2])})
default2=defaultdict()
print(default2)
#結(jié)果
>>defaultdict(None, {})
default2['a']=1
default2['a']=2
print(default2)
#結(jié)果
>>defaultdict(None, {'a': 2})
實例一:將某些重復(fù)項按照鍵歸檔
from collections import defaultdict
pairs=[("name","ld"),("sex",1),("number","123456789"),("number","9999999")]
d=defaultdict(list)
for key,value in pairs:
d[key].append(value)#如果自己實現(xiàn),需要判斷鍵是否存在
print(d)
#結(jié)果
>>defaultdict(<type 'list'>, {'number': ['123456789', '9999999'], 'name': ['ld'], 'sex': [1]})
實例二:統(tǒng)計單詞出現(xiàn)的次數(shù)
from collections import defaultdict
strings=("hi","python","word","python","sweet","honey","hi","python")
counts=defaultdict(lambda :0)
for iterm in strings:
counts[iterm]+=1
print(counts)
#結(jié)果
>>defaultdict(<function <lambda> at 0x01A93CF0>, {'python': 3, 'sweet': 1, 'honey': 1, 'hi': 2, 'word': 1})
-
字典排序
通常下字典是無序的颓帝,不管添加的先后順序(python3.6可以有序)
如果要保持添加的順序,可使用collections 模塊中的OrderedDict 類窝革。
from collections import OrderedDict
dicts={}
dicts["d"]=4
dicts["c"]=3
dicts["a"]=1
dicts["b"]=2
print(dicts)
#結(jié)果
>>{'a': 1, 'c': 3, 'b': 2, 'd': 4}
orderdict= OrderedDict()
orderdict["d"]=4
orderdict["c"]=3
orderdict["a"]=1
orderdict["b"]=2
print(orderdict)
#結(jié)果
>>OrderedDict([('d', 4), ('c', 3), ('a', 1), ('b', 2)])
?? OrderedDict 內(nèi)部維護著一個根據(jù)鍵插入順序排序的雙向鏈表购城。每次當(dāng)一個新的元素插入進來的時候,它會被放到鏈表的尾部虐译。對于一個已經(jīng)存在的鍵的重復(fù)賦值不會改變鍵的順序瘪板。需要注意的是,一個 OrderedDict的大小是一個普通字典的兩倍漆诽,因為它內(nèi)部維護著另外一個鏈表侮攀。所以使用時需要結(jié)合內(nèi)存的消耗情況權(quán)衡是否使用OrderedDict