天天看點

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

【妹子說】上次講了清單,今天接着講講字典吧。

首先我要說,字典這個容器類型真的非常好用,也非常重要。

字典和清單完全不同,字典裡的對象是無序的,他是通過一對對的鍵和值來反映一種映射關系。字典裡,每個鍵都是唯一的,我們可以通過鍵來存取對應的值,而不能像清單那樣通過位置來索引。

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

D = {
'name':{'first':'Bob', 'last':'Smith'},
'job' : ['dev','mgr'],
'age' : 0.5,
'addr': 'BeiJing'
}
print(D)

{'job': ['dev', 'mgr'], 'addr': 'BeiJing', 'name': {'first': 'Bob', 'last': 'Smith'}, 'age': 0.5}
           

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

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

D = {'food':'spam', 'quality':4, 'color': 'pink'}
print(D['food'])
D['sex'] = 'gender'
print(D)

spam
{'food': 'spam', 'color': 'pink', 'quality': 4, 'sex': 'gender'}
           

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

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

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

基于這種需求,我們再介紹其他幾個生成字典的方法:

第一種方法:初始為空字典,動态填充新的鍵和值

D = {}
D['name'] = 'Bob'
D['job'] = 'dev'
print(D)

{'name': 'Bob', 'job': 'dev'}
           

重點是第二種方法,用清單動态生成字典。

一般來說字典的鍵是事先約定好的,比如姓名、性别、生日等等,而值往往是要在程式運作過程當中通過使用者輸入、網頁資料抓取等不同手段動态擷取的。本方法可以在擷取值清單後動态生成一個字典。

key_list = ['a','b','c']
value_list = [11,22,33]
D = dict(zip(key_list, value_list))
print(D)

{'a': 11, 'c': 33, 'b': 22}
           

第三種方法,用鍵值對元組組成的清單構造字典。(元組我們後面要講,就是這個圓括号)

D = dict([('aa',11),('bb',22),('cc',33)])
print(D)

{'cc': 33, 'aa': 11, 'bb': 22}
           

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

做法很簡單

D1 = {'a':1,'b':2, 'c':3}
D2 = {'c':8, 'd':9}
D1.update(D2)
print(D1)

{'c': 8, 'b': 2, 'a': 1, 'd': 9}
           

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

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

這麼說也對,也不對。

我們具體看看對于鍵不存在這種情況下的處理技巧。

D = {'a':1,'b':2, 'c':3}
print(D['d'])

Traceback (most recent call last):
 File "E:/12homework/12homework.py", line 2, in <module>
print(D['d'])
KeyError: 'd'
           

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

D = {'a':1, 'b':2}
print('c' in D)
if not 'c' in D:
print('missing')

False
Missing
           

其實,有一種更進階的方法實作了上述的判斷功能。那就是get方法,get方法中第二個參數指的是鍵不存在時指定傳回的預設值,如果不設定這個值,則傳回None

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

0
           

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

這又是一個好問題,

我們可以用下面的方法來一次性擷取包含所有鍵的清單:

D = {'a': 11, 'b': 22, 'c': 33, 'd': 44, 'e': 55}
print(list(D.keys()))

['b', 'a', 'd', 'e', 'c']
           

D.Keys方法傳回的是一個疊代器,而不是直接就給出一個清單,關于疊代器後面會專門講的,這裡隻需記住此處将疊代器作為參數來初始化一個list,可以一次性生成所有的鍵,并将其列印出來。

想擷取值的清單,處理方法也十分類似

D = {'a': 11, 'b': 22, 'c': 33, 'd': 44, 'e': 55}
print(list(D.values()))

[11, 33, 44, 55, 22]
           

我們還可以用同樣類似的方法同時擷取鍵值對的清單

D = {'a': 11, 'b': 22, 'c': 33, 'd': 44, 'e': 55}
print(list(D.items()))

[('d', 44), ('a', 11), ('c', 33), ('e', 55), ('b', 22)]
           

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

對,字典和清單大同小異。而且删除也是利用del和pop兩種方法

D = {'a': 11, 'b': 22, 'c': 33, 'd': 44, 'e': 55}
del D['a']
print(D)

{'b': 22, 'c': 33, 'e': 55, 'd': 44}
           

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

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

11
{'b': 22, 'e': 55, 'd': 44, 'c': 33}
           

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

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

D = {'a': 11, 'b': 22, 'c': 33, 'd': 44, 'e': 55}
print(sorted(D))
print(sorted(D.keys()))

['a', 'b', 'c', 'd', 'e']
['a', 'b', 'c', 'd', 'e']
           

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

原文釋出時間為:2018-07-19

本文作者:醬油哥

本文來自雲栖社群合作夥伴“

Python愛好者社群

”,了解相關資訊可以關注“

繼續閱讀