python字典

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.字典推導式

image.png

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'] 會按照以下的步驟來行事

    1. 調(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)的姓蜂。這意味著如果對原映射做出了改動,我們通過這個視圖可以觀察到医吊,但是無法通過這個視圖對原映射做出修改钱慢。

image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市卿堂,隨后出現(xiàn)的幾起案子束莫,更是在濱河造成了極大的恐慌懒棉,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件览绿,死亡現(xiàn)場離奇詭異策严,居然都是意外死亡,警方通過查閱死者的電腦和手機饿敲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門妻导,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人怀各,你說我怎么就攤上這事倔韭。” “怎么了瓢对?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵寿酌,是天一觀的道長。 經(jīng)常有香客問我硕蛹,道長醇疼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任法焰,我火速辦了婚禮秧荆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘壶栋。我一直安慰自己辰如,他們只是感情好,可當我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布贵试。 她就那樣靜靜地躺著琉兜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪毙玻。 梳的紋絲不亂的頭發(fā)上豌蟋,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天,我揣著相機與錄音桑滩,去河邊找鬼梧疲。 笑死,一個胖子當著我的面吹牛运准,可吹牛的內(nèi)容都是我干的幌氮。 我是一名探鬼主播,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼胁澳,長吁一口氣:“原來是場噩夢啊……” “哼椭盏!你這毒婦竟也來了婚瓜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤构韵,失蹤者是張志新(化名)和其女友劉穎事扭,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年喂分,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片机蔗。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡蒲祈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蜒车,到底是詐尸還是另有隱情讳嘱,我是刑警寧澤,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布酿愧,位于F島的核電站,受9級特大地震影響邀泉,放射性物質(zhì)發(fā)生泄漏嬉挡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一汇恤、第九天 我趴在偏房一處隱蔽的房頂上張望庞钢。 院中可真熱鬧,春花似錦因谎、人聲如沸基括。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽风皿。三九已至,卻和暖如春匠璧,著一層夾襖步出監(jiān)牢的瞬間桐款,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工夷恍, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留魔眨,地道東北人。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓酿雪,卻偏偏與公主長得像遏暴,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子指黎,可洞房花燭夜當晚...
    茶點故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 一朋凉、字典基本操作 基本語法:dict = {'ob1':'computer', 'ob2':'mouse', 'o...
    古佛青燈度流年閱讀 2,646評論 0 1
  • 1 字典基礎(chǔ)操作 1.1 創(chuàng)建字典 通過{}操作符創(chuàng)建字典aDict = {'name':'ke', 'age':...
    Ke爺閱讀 586評論 0 0
  • 本篇將介紹Python里面的字典,更多內(nèi)容請參考:Python學習指南 Python是什么袋励? Python內(nèi)置了字...
    小七奇奇閱讀 1,436評論 0 5
  • 學習了 Python 基本的字典操作后侥啤,學習這些進階操作当叭,讓寫出的代碼更加優(yōu)雅簡潔和 pythonic 。 與字...
    追夢人物閱讀 12,850評論 10 70
  • 1. 字典的一些知識點 字典特性可變盖灸、可存儲任意類型對象蚁鳖、無序 字典的生成?直接用dict 字典的排序赁炎?sorte...
    海螺上的斑點閱讀 404評論 0 0