給妹子講python--02學會用字典

陪伴學習,一路成長。請一起關注,一起點贊吧!

【要點搶先看】

1.生成字典的實用方法n2.字典鍵和值的高效處理方法n3.字典的刪除與排序n

【妹子說】上次講了列表,今天接著講講字典吧。

首先我要說,字典這個容器類型真的非常好用,也非常重要。字典和列表完全不同,字典里的對象是無序的,他是通過一對對的鍵和值來反映一種映射關係。字典里,每個鍵都是唯一的,我們可以通過鍵來存取對應的值,而不能像列表那樣通過位置來索引。

首先來看看怎樣用最簡單的方法生成一個字典,先弄一個出來再說。

D = {nname:{first:Bob, last:Smith},njob : [dev,mgr],nage : 0.5,naddr: BeiJingn}nprint(D)n{job: [dev, mgr], addr: BeiJing, name: {first: Bob, last: Smith}, age: 0.5}n

從這個例子的輸出結果我們可以看出,字典也是可以包含任意的數據類型,即所謂的異構性,甚至可以嵌套一個字典,同時從列印的結果看,字典里的各個元素確實沒有什麼順序可言

對字典值的讀取和修改也很簡單

D = {food:spam, quality:4, color: pink}nprint(D[food])nD[sex] = gendernprint(D)nnspamn{food: spam, color: pink, quality: 4, sex: gender}n

我們用『food』鍵就可以讀取其對應的值---字元串對象『spam』,此外我們還可以原地增加『sex』鍵以及對應的值,當然,也可以原地修改其他已有的鍵和值。

【妹子問了】恩,可是我覺得這種方法很死板呀,他要求我們一個一個的把數據手動輸入來構建字典,這樣子感覺不是很方便呢

這個問題問的太好了。特別是當我們事先不知道字典有哪些鍵和值的時候,如果想利用在程序中動態獲取的數據集來生成字典,上述方法就辦不到了。

那我們再介紹其他幾個實用的方法:

第一種方法是一開始生成一個空字典,然後不斷的用新的鍵和值去填充

D = {}nD[name] = BobnD[job] = devnprint(D)nn{name: Bob, job: dev}n

重點是第二種方法,一般來說字典的鍵是事先約定好的,比如姓名、性別、生日之類,而值往往是要在程序運行過程當中通過用戶輸入、網頁數據抓取等不同手段動態獲取的。本方法可以在獲取值列表後動態生成一個字典。

key_list = [a,b,c]nvalue_list = [11,22,33]nD = dict(zip(key_list, value_list))nprint(D)nn{a: 11, c: 33, b: 22}n

第三種方法,用一個個鍵值對的元組組成的列表(元組我們後面要講,就是這個圓括弧)來構造一個字典

D = dict([(aa,11),(bb,22),(cc,33)])nprint(D)nn{cc: 33, aa: 11, bb: 22}n

【妹子問】哦,有了這些好用的方法我就放心啦。還有一個問題:如果我有兩個已經生成的字典,想要把他們合併應該怎麼做呢?

做法很簡單

D1 = {a:1,b:2, c:3}nD2 = {c:8, d:9}nD1.update(D2)nprint(D1)nn{c: 8, b: 2, a: 1, d: 9}n

不過要注意,如果這兩個字典中有衝突的鍵,那麼會無規律的進行覆蓋,所以應該避免這種情況

【妹子說】現在我明白在不同使用場景下如何來生成一個字典了,那我如果訪問一個不存在的字典鍵,應該會報錯吧

這麼說也對,也不對:

D = {a:1,b:2, c:3}nprint(D[d])nnTraceback (most recent call last):n File "E:/12homework/12homework.py", line 2, in <module>nprint(D[d])nKeyError: dn

用這種直接訪問的方式,如果鍵不存在就會報錯,但是可以引入in判斷方法進行避免

D = {a:1, b:2}nprint(c in D)nif not c in D:nprint(missing)nnFalsenMissingn

其實,有一種更高級的方法實現了上述的判斷功能。那就是get方法,get方法中第二個參數指的是鍵不存在時指定返回的默認值,如果不設置這個值,則返回None

D = {a:11,b:22, c:33}nprint(D.get(d,0))nn0n

【妹子又問了】我們在實際使用字典時,很多情況下不應該這麼一個一個的手動訪問字典鍵吧,比如我想一次性獲取所有的鍵,應該怎麼做?

這又是一個好問題,我們可以用下面的方法來一次性獲取包含所有鍵的列表

D = {a: 11, b: 22, c: 33, d: 44, e: 55}nprint(list(D.keys()))nn[b, a, d, e, c]n

D.Keys方法返回的是一個迭代器,而不是直接就給出一個列表,關於迭代器後面會專門講的,這裡只需記住此處將迭代器作為參數來初始化一個list,可以一次性生成所有的鍵,並將其列印出來。

想獲取值的列表,處理方法也十分類似

D = {a: 11, b: 22, c: 33, d: 44, e: 55}nprint(list(D.values()))nn[11, 33, 44, 55, 22]n

我們還可以用同樣類似的方法同時獲取鍵值對的列表

D = {a: 11, b: 22, c: 33, d: 44, e: 55}nprint(list(D.items()))nn[(d, 44), (a, 11), (c, 33), (e, 55), (b, 22)]n

【妹子說】和列表相類比,下面是不是也得說說字典的刪除和排序問題?

對,字典和列表大同小異。而且刪除也是利用del和pop兩種方法

D = {a: 11, b: 22, c: 33, d: 44, e: 55}ndel D[a]nprint(D)nn{b: 22, c: 33, e: 55, d: 44}n

pop方法是在刪除指定鍵對應的元素的同時,返回這個鍵所對應的值

D = {a: 11, b: 22, c: 33, d: 44, e: 55}nprint(D.pop(a))nprint(D)nn11n{b: 22, e: 55, d: 44, c: 33}n

【妹子反問我了】我記得你最開始的時候說,在字典里對象是無序的呀,那怎麼還存在排序的概念呢?

原來是挖坑在等我呀,字典的排序操作實際上是在對鍵進行排序,他返回一個排好序的鍵的列表

D = {a: 11, b: 22, c: 33, d: 44, e: 55}nprint(sorted(D))nprint(sorted(D.keys()))nn[a, b, c, d, e]n[a, b, c, d, e]n

這裡埋一個伏筆,內置函數sorted接受的都是可迭代對象,這個反覆出現的概念後面我們一定會好好談談。

【妹子說】恩,今天講的真挺多的,字典我應該會用了,那今天就到這吧~


推薦閱讀:

Python · 神經網路(三)· 網路
使用Python實現一個文本自動摘要工具
Kivy中文編程指南:配置修改
10道Python小題

TAG:字典 | 容器 | Python |