【妹子說】上次講了列表,今天接著講講字典吧。
首先我要說,字典這個容器型別真的非常好用,也非常重要。
字典和列表完全不同,字典裡的物件是無序的,他是通過一對對的鍵和值來反映一種對映關係。字典裡,每個鍵都是唯一的,我們可以通過鍵來訪問對應的值,而不能像列表那樣通過位置來索引。
首先來看看怎樣用最簡單的方法生成乙個字典,先弄乙個出來再說。
d = ,
'job' : ['dev','mgr'],
'age' : 0.5,
'addr': 'beijing'
}print(d)
, 'age': 0.5}
從這個例子的輸出結果我們可以看出,字典也是可以包含任意的資料型別,即所謂的異構性,甚至可以巢狀乙個字典,同時從列印的結果看,字典裡的各個元素確實沒有什麼順序可言。
對字典值的讀取和修改也很簡單
d =
print(d['food'])
d['***'] = 'gender'
print(d)
spam
我們用『food』鍵就可以讀取其對應的值---字串物件『spam』,此外我們還可以原地增加『***』鍵以及對應的值,當然,也可以原地修改其他已有的鍵和值。
【妹子問】恩,可是我覺得這種方法很死板呀,他要求我們乙個乙個的把資料手動輸入來構建字典,這樣子感覺不是很方便呢
這個問題問的太好了。特別是當我們事先不知道字典有哪些鍵和值的時候,如果想利用在程式中動態獲取的資料集來生成字典,上述方法就辦不到了。
基於這種需求,我們再介紹其他幾個生成字典的方法:
第一種方法:初始為空字典,動態填充新的鍵和值
d = {}
d['name'] = 'bob'
d['job'] = 'dev'
print(d)
重點是第二種方法,用列表動態生成字典。
一般來說字典的鍵是事先約定好的,比如姓名、性別、生日等等,而值往往是要在程式執行過程當中通過使用者輸入、網頁資料抓取等不同手段動態獲取的。本方法可以在獲取值列表後動態生成乙個字典。
key_list = ['a','b','c']
value_list = [11,22,33]
d = dict(zip(key_list, value_list))
print(d)
第三種方法,用鍵值對元組組成的列表構造字典。(元組我們後面要講,就是這個圓括號)
d = dict([('aa',11),('bb',22),('cc',33)])
print(d)
【妹子問】哦,有了這些好用的方法我就放心啦。還有乙個問題:如果我有兩個已經生成的字典,想要把他們合併應該怎麼做呢?
做法很簡單
d1 =
d2 =
d1.update(d2)
print(d1)
不過要注意,如果這兩個字典中有衝突的鍵,那麼會無規律的進行覆蓋,所以應該避免這種情況
【妹子說】現在我明白在不同使用場景下如何來生成乙個字典了,那我如果訪問乙個不存在的字典鍵,應該會報錯吧
這麼說也對,也不對。
我們具體看看對於鍵不存在這種情況下的處理技巧。
d =
print(d['d'])
traceback (most recent call last):
file "e:/12homework/12homework.py", line 2, in print(d['d'])
keyerror: 'd'
用這種直接訪問的方式,如果鍵不存在就會報錯,但是可以引入in判斷方法進行避免
d =
print('c' in d)
if not 'c' in d:
print('missing')
false
missing
其實,有一種更高階的方法實現了上述的判斷功能。那就是get方法,get方法中第二個引數指的是鍵不存在時指定返回的預設值,如果不設定這個值,則返回none
d =
print(d.get('d',0))
0
【妹子又問了】我們在實際使用字典時,很多情況下不應該這麼乙個乙個的手動訪問字典鍵吧,比如我想一次性獲取所有的鍵,應該怎麼做?
這又是乙個好問題,
我們可以用下面的方法來一次性獲取包含所有鍵的列表:
d =
print(list(d.keys()))
['b', 'a', 'd', 'e', 'c']
d.keys方法返回的是乙個迭代器,而不是直接就給出乙個列表,關於迭代器後面會專門講的,這裡只需記住此處將迭代器作為引數來初始化乙個list,可以一次性生成所有的鍵,並將其列印出來。
想獲取值的列表,處理方法也十分類似
d =
print(list(d.values()))
[11, 33, 44, 55, 22]
我們還可以用同樣類似的方法同時獲取鍵值對的列表
d =
print(list(d.items()))
[('d', 44), ('a', 11), ('c', 33), ('e', 55), ('b', 22)]
【妹子說】和列表相模擬,下面是不是也得說說字典的刪除和排序問題?
對,字典和列表大同小異。而且刪除也是利用del和pop兩種方法
d =
del d['a']
print(d)
pop方法是在刪除指定鍵對應的元素的同時,返回這個鍵所對應的值
d =
print(d.pop('a'))
print(d)
11
【妹子反問我了】我記得你最開始的時候說,在字典裡物件是無序的呀,那怎麼還存在排序的概念呢?
原來是挖坑在等我呀,字典的排序操作實際上是在對鍵進行排序,他返回乙個排好序的鍵的列表
d =
print(sorted(d))
print(sorted(d.keys()))
['a', 'b', 'c', 'd', 'e']
['a', 'b', 'c', 'd', 'e']
這裡埋乙個伏筆,內建函式sorted接受的都是可迭代物件,這個反覆出現的概念後面我們一定會好好談談。 給妹子講python S01E23初識異常處理
1.異常的預設處理和主動捕獲 2.主動觸發異常和自定義異常 3.finally終止 塊的用法 妹子問 從字面上來看,異常是程式執行時出現的錯誤吧。沒錯,每當在執行時檢測到程式錯誤時,python就會引發異常。對待異常有兩種方法 一是可以在程式中捕捉和響應錯誤 或者忽略已發生的異常。如果是忽略已發生的...
給妹子講python S01E23初識異常處理
1.異常的預設處理和主動捕獲 2.主動觸發異常和自定義異常 3.finally終止 塊的用法 妹子問 從字面上來看,異常是程式執行時出現的錯誤吧。沒錯,每當在執行時檢測到程式錯誤時,python就會引發異常。對待異常有兩種方法 一是可以在程式中捕捉和響應錯誤 或者忽略已發生的異常。如果是忽略已發生的...
給妹子講python S01E09檔案操作小意思
前面幾集裡,我們詳細介紹了python字串以及編譯碼的有關內容,這些內容實質上也是檔案操作的基礎。今天這一集,我們就正好來說說檔案操作。先預熱一下,看乙個利用open函式開啟檔案的簡單例子 myfile open myfile.txt w myfile open myfile.txt r 妹子說 檔...