python3 第十四章,python3
在python中字典是另一種可變容器模型,且可儲存任意類型對象。
字典的每個索引值(key=>value)對用冒號(:)分割,每個對之間用逗號(,)分割,整個字典包括在花括弧({})中 ,格式如下所示:
d = {key1 : value1, key2 : value2 }
- 鍵必須是唯一的,但值則不必。
- 值可以取任何資料類型,但鍵必須是不可變的,如字串,數字或元組。
Python內建了字典:dict的支援,dict全稱dictionary,在其他語言中也稱為map,使用鍵-值(key-value)儲存,具有極快的尋找速度。
舉個例子,假設要根據同學的名字尋找對應的成績,如果用list實現,需要兩個list:
names = ['Michael', 'Bob', 'Tracy']scores = [95, 75, 85]
給定一個名字,要尋找對應的成績,就先要在names中找到對應的位置,再從scores取出對應的成績,list越長,耗時越長。
如果用dict實現,只需要一個“名字”-“成績”的對照表,直接根據名字尋找成績,無論這個表有多大,尋找速度都不會變慢。用Python寫一個dict如下:
d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}print('Michael的成是:', d['Michael'])
以上代碼,輸出:
Michael的成是: 95
為什麼dict尋找速度這麼快?因為dict的實現原理和查字典是一樣的。假設字典包含了1萬個漢字,我們要查某一個字,一個辦法是把字典從第一頁往後翻,直到找到我們想要的字為止,這種方法就是在list中尋找元素的方法,list越大,尋找越慢。第二種方法是先在字典的索引表裡(比如部首表)查這個字對應的頁碼,然後直接翻到該頁,找到這個字。無論找哪個字,這種尋找速度都非常快,不會隨著字典大小的增加而變慢。dict就是第二種實現方式。
1、訪問字典裡的值
把相應的鍵放入熟悉的方括弧,如下執行個體:
dict = {'Name': 'roy', 'Age': 1, 'Class': 'First'}print("dict['Name']: ", dict['Name'])print("dict['Age']: ", dict['Age'])
以上代碼,輸出:
dict['Name']: roydict['Age']: 1
如果key不存在,dict就會報錯:
dict = {'Name': 'roy', 'Age': 1, 'Class': 'First'}print("dict['sex']: ", dict['sex'])
以上代碼,輸出:
Traceback (most recent call last): File "D:/python/teaching/01.py", line 2, in <module> print("dict['sex']: ", dict['sex'])KeyError: 'sex'
要避免key不存在的錯誤,有兩種辦法,一是通過in判斷key是否存在:
dict = {'Name': 'roy', 'Age': 1, 'Class': 'First'}if 'sex' in dict: print("dict['sex']: ", dict['sex'])else: print('沒有找到key=sex的元素')
以上代碼,輸出:
沒有找到key=sex的元素
二是通過dict提供的get()方法,如果key不存在,可以返回None,或者自己指定的value:
dict = {'Name': 'roy', 'Age': 1, 'Class': 'First'}if dict.get('sex'): print("dict['sex']: ", dict['sex'])else: print(dict.get('sex','沒有找到key=sex的元素')) # 自己指了一個value
以上代碼,輸出:
沒有找到key=sex的元素
注意:返回None的時候Python的互動環境不顯示結果。
2、修改字典
向字典添加新內容的方法是增加新的鍵/值對,修改或刪除已有鍵/值對如下執行個體:
dict = {'Name': 'roy', 'Age': 1, 'Class': 'First'}dict['Age'] = 100 # 更新 Agedict['sex'] = '男' # 添加 sexprint('dict[\'Age\'] :', dict['Age'])print('dict[\'sex\'] :', dict['sex'])
以上代碼,輸出:
dict['Age'] : 100dict['sex'] : 男
3、刪除字典元素
能刪單一的元素也能清空字典,清空只需一項操作。
顯示刪除一個字典用del命令,如下執行個體:
dict = {'Name': 'roy', 'Age': 1, 'Class': 'First'}dict['Age'] = 100 # 更新 Agedict['sex'] = '男' # 添加 sexdel dict['Age'] # 刪除鍵 'sex' print('dict :', dict)
以上代碼,輸出:
dict : {'Name': 'roy', 'Class': 'First', 'sex': '男'}
也可以用clear()清空字典:
dict = {'Name': 'roy', 'Age': 1, 'Class': 'First'}dict.clear() # 清空字典print('dict :', dict)
以上代碼,輸出:
dict : {}
也可以刪除整個字典:
dict = {'Name': 'roy', 'Age': 1, 'Class': 'First'}del dict # 刪除字典print('dict :', dict)
以上代碼,輸出:
dict : <class 'dict'>
執行 del 操作後字典不再存在了
要刪除一個key,用pop(key)方法,對應的value也會從dict中刪除:
dict = {'Name': 'roy', 'Age': 1, 'Class': 'First'}dict.pop('Name') # 刪除鍵 'Name'print('dict :', dict)
以上代碼,輸出:
dict : {'Age': 1, 'Class': 'First'}
注意,dict內部存放的順序和key放入的順序是沒有關係的。
和list比較,dict有以下幾個特點:
而list相反:
所以,dict是用空間來換取時間的一種方法。
dict可以用在需要高速尋找的很多地方,在Python代碼中幾乎無處不在,正確使用dict非常重要,需要牢記的第一條就是dict的key必須是不可變對象。
這是因為dict根據key來計算value的儲存位置,如果每次計算相同的key得出的結果不同,那dict內部就完全混亂了。這個通過key計算位置的演算法稱為雜湊演算法(Hash)。
要保證hash的正確性,作為key的對象就不能變。在Python中,字串、整數等都是不可變的,因此,可以放心地作為key。而list是可變的,就不能作為key