字典也是 Python 提供的一種經常使用的數據結構,它用於存放具備映射關係的數據。python
好比有份成績表數據,語文:79,數學:80,英語:92,這組數據看上去像兩個列表,但這兩個列表的元素之間有必定的關聯關係。若是單純使用兩個列表來保存這組數據,則沒法記錄兩組數據之間的關聯關係。
爲了保存具備映射關係的數據,Python 提供了字典,字典至關於保存了兩組數據,其中一組數據是關鍵數據,被稱爲 key;另外一組數據可經過 key 來訪問,被稱爲 value。形象地看,字典中 key 和 value 的關聯關係如圖 1 所示:數據結構
圖1 字典保存的關聯數據ssh
因爲字典中的 key 是很是關鍵的數據,並且程序須要經過 key 來訪問 value,所以字典中的 key 不容許重複。
程序既可以使用花括號語法來建立字典,也可以使用 dict() 函數來建立字典。實際上,dict 是一種類型,它就是 Python 中的字典類型。
在使用花括號語法建立字典時,花括號中應包含多個 key-value 對,key 與 value 之間用英文冒號隔開;多個 key-value 對之間用英文逗號隔開函數
以下代碼示範了使用花括號語法建立字典:spa
scores = {'語文': 89, '數學': 92, '英語': 93} print(scores) # 空的花括號表明空的dict empty_dict = {} print(empty_dict) # 使用元組做爲dict的key dict2 = {(20, 30):'good', 30:'bad'} print(dict2)
上面程序中第 1 行代碼建立了一個簡單的 dict,該 dict 的 key 是字符串,value 是整數;第 4 行代碼使用花括號建立了一個空的字典;第 7 行代碼建立的字典中第一個 key 是元組,第二個 key 是整數值,這都是合法的。.net
須要指出的是,元組能夠做爲 dict 的 key,但列表不能做爲元組的 key。這是因爲 dict 要求 key 必須是不可變類型,但列表是可變類型,所以列表不能做爲元組的 key。code
>>> vegetables = [('celery', 1.58), ('brocoli', 1.29), ('lettuce', 2.19)] # 建立一個包含3組的key-value對的列表 >>> print(vegetables) [('celery', 1.58), ('brocoli', 1.29), ('lettuce', 2.19)] >>> dict3 = dict(vegetables)#轉換爲字典 >>> dict3 {'celery': 1.58, 'brocoli': 1.29, 'lettuce': 2.19} >>> >>> cars = [['BMW', 8.5], ['BENS', 8.3], ['AUDI', 7.9]] >>> dict4=dict(cars) >>> print(dict4) {'BMW': 8.5, 'BENS': 8.3, 'AUDI': 7.9} >>>
若是不爲 dict() 函數傳入任何參數,則表明建立一個空的字典。例如以下代碼:orm
>>> dict1=dict() >>> dict1 {} >>>
還可經過爲 dict 指定關鍵字參數建立字典,此時字典的 key 不容許使用表達式。例如以下代碼:對象
#使用關鍵字參數來建立字典 >>> dict6 = dict(spinach = 1.39, cabbage = 2.59) >>> print(dict6) {'spinach': 1.39, 'cabbage': 2.59} >>>
對於初學者而言,應牢記字典包含多個 key-value 對,而 key 是字典的關鍵數據,所以程序對字典的操做都是基於 key 的。基本操做以下:blog
以下代碼示範了經過 key 訪問 value:
scores = {'語文': 89} # 經過key訪問value print(scores['語文'])
若是要爲 dict 添加 key-value 對,只需爲不存在的 key 賦值便可:# 對不存在的key賦值,就是增長key-value對
>>> scores= {'數學':93} >>> scores['語文']=90 >>> print(scores) {'數學':
若是要刪除宇典中的 key-value 對,則可以使用 del 語句。例如以下代碼:
>>> scores={'數學': 93, '語文': 90} >>> del scores['數學'] >>> scores {'語文': 90}
若是對 dict 中存在的 key-value 對賦值,新賦的 value 就會覆蓋原有的 value,這樣便可改變 dict 中的 key-value 對。例如以下代碼:
cars = {'BMW': 8.5, 'BENS': 8.3, 'AUDI': 7.9} # 對存在的key-value對賦值,改變key-value對 cars['BENS'] = 4.3 cars['AUDI'] = 3.8 print(cars) # {'BMW': 8.5, 'BENS': 4.3, 'AUDI': 3.8}
若是要判斷字典是否包含指定的 key,則可使用 in 或 not in 運算符。須要指出的是,對於 dict 而言,in 或 not in 運算符都是基於 key 來判斷的。例如以下代碼:
# 判斷cars是否包含名爲'AUDI'的key print('AUDI' in cars) # True # 判斷cars是否包含名爲'PORSCHE'的key print('PORSCHE' in cars) # False print('LAMBORGHINI' not in cars) # True
經過上面介紹能夠看出,字典的 key 是它的關鍵。換個角度來看,字典的 key 就至關於它的索引,只不過這些索引不必定是整數類型,字典的 key 能夠是任意不可變類型。
能夠這樣說,字典至關於索引是任意不可變類型的列表:而列表則至關於 key 只能是整數的字典。所以,若是程序中要使用的字典的 key 都是整數類型,則可考慮可否換成列表。
此外,還有一點須要指出,列表的索引老是從 0 開始、連續增大的;但字典的索引即便是整數類型,也不須要從 0 開始,並且不須要連續。所以,列表不容許對不存在的索引賦值:但字典則容許直接對不存在的 key 賦值,這樣就會爲字典增長一個 key-value 對。
列表不容許對不存在的索引賦值,但字典則容許直接對不存在的 key 賦值。
字典由 dict 類表明,所以咱們一樣可以使用 dir(dict) 來查看該類包含哪些方法。在交互式解釋器中輸入 dir(dict) 命令,將看到以下輸出結果:
>>> dir(dict) ['__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values'] >>>
clear() 用於清空字典中全部的 key-value 對,對一個字典執行 clear() 方法以後,該字典就會變成一個空字典。例如以下代碼:
>>> cars = {'BMW': 8.5, 'BENS': 8.3, 'AUDI': 7.9} >>> cars {'BMW': 8.5, 'BENS': 8.3, 'AUDI': 7.9} >>> cars.clear() >>> cars {} >>>
get() 方法其實就是根據 key 來獲取 value,它至關於方括號語法的加強版,當使用方括號語法訪問並不存在的 key 時,字典會引起 KeyError 錯誤;但若是使用 get() 方法訪問不存在的 key,該方法會簡單地返回 None,不會致使錯誤。例如以下代碼:
>>> cars = {'BMW': 8.5, 'BENS': 8.3, 'AUDI': 7.9} 8.5 >>> cars.get('PORSCHE') >>> print(cars.get('PORSCHE')) None >>>
update() 方法可以使用一個字典所包含的 key-value 對來更新己有的字典。在執行 update() 方法時,若是被更新的字典中己包含對應的 key-value 對,那麼原 value 會被覆蓋;若是被更新的字典中不包含對應的 key-value 對,則該 key-value 對被添加進去。例如以下代碼:
>>> cars = {'BMW': 8.5, 'BENS': 8.3, 'AUDI': 7.9} >>> cars.update({'BMW':4.5, 'PORSCHE': 9.3}) >>> cars {'BMW': 4.5, 'BENS': 8.3, 'AUDI': 7.9, 'PORSCHE': 9.3} >>>
從上面的執行過程能夠看出,因爲被更新的 dict 中己包含 key 爲「AUDI」的 key-value 對,所以更新時該 key-value 對的 value 將被改寫;但若是被更新的 dict 中不包含 key 爲「PORSCHE」的 key-value 對,那麼更新時就會爲原字典增長一個 key-value 對。
items()、keys()、values() 分別用於獲取字典中的全部 key-value 對、全部 key、全部 value。這三個方法依次返回 dict_items、dict_keys 和 dict_values 對象,Python 不但願用戶直接操做這幾個方法,但可經過 list() 函數把它們轉換成列表。以下代碼示範了這三個方法的用法:
cars = {'BMW': 8.5, 'BENS': 8.3, 'AUDI': 7.9} # 獲取字典全部的key-value對,返回一個dict_items對象 ims = cars.items() print(type(ims))
<class 'dict_items'> # 將dict_items轉換成列表 print(list(ims))
[('BMW', 8.5), ('BENS', 8.3), ('AUDI', 7.9)] # 訪問第2個key-value對 print(list(ims)[1])
# ('BENS', 8.3) # 獲取字典全部的key,返回一個dict_keys對象 kys = cars.keys() print(type(kys)) # <class 'dict_keys'> # 將dict_keys轉換成列表 print(list(kys)) # ['BMW', 'BENS', 'AUDI'] # 訪問第2個key print(list(kys)[1]) # 'BENS' # 獲取字典全部的value,返回一個dict_values對象 vals = cars.values() # 將dict_values轉換成列表 print(type(vals)) # [8.5, 8.3, 7.9] # 訪問第2個value print(list(vals)[1]) # 8.3
從上面代碼能夠看出,程序調用字典的 items()、keys()、values() 方法以後,都須要調用 list() 函數將它們轉換爲列表,這樣便可把這三個方法的返回值轉換爲列表。
在 Python 2.x 中,items()、keys()、values() 方法的返回值原本就是列表,徹底能夠不用 list() 函數進行處理。固然,使用 list() 函數處理也行,列表被處理以後依然是列表。
pop() 方法用於獲取指定 key 對應的 value,並刪除這個 key-value 對。以下方法示範了 pop() 方法的用法:
>>> cars = {'BMW': 8.5, 'BENS': 8.3, 'AUDI': 7.9} >>> cars.pop('BENS') 8.3 >>> cars {'BMW': 8.5, 'AUDI': 7.9} >>>
python 3 popitem() 方法用於隨機彈出字典中最後一個值
>>> cars = {'AUDI': 7.9, 'BENS': 8.3, 'BMW': 8.5} >>> print(cars.popitem()) ('BMW', 8.5) >>> >>> cars {'AUDI': 7.9, 'BENS': 8.3} >>>
因爲實際上 popitem 彈出的就是一個元組,所以程序徹底能夠經過序列解包的方式用兩個變量分別接收 key 和 value。例如以下代碼:
>>> cars = {'AUDI': 7.9, 'BENS': 8.3, 'BMW': 8.5} >>> k,v=cars.popitem() >>> print(k,v) BMW 8.5 >>>
setdefault() 方法也用於根據 key 來獲取對應 value 的值。但該方法有一個額外的功能,即當程序要獲取的 key 在字典中不存在時,該方法會先爲這個不存在的 key 設置一個默認的 value,而後再返回該 key 對應的 value。
總之,setdefault() 方法總能返回指定 key 對應的 value;若是該 key-value 對存在,則直接返回該 key 對應的 value;若是該 key-value 對不存在,則先爲該 key 設置默認的 value,而後再返回該 key 對應的 value。
以下代碼示範了 setdefault() 方法的用法:
>>> cars = {'BMW': 8.5, 'BENS': 8.3, 'AUDI': 7.9}
# 設置默認值,該key在dict中不存在,新增key-value對
>>> print(cars.setdefault('PORSCHE', 9.2)) 9.2 >>> cars {'BMW': 8.5, 'BENS': 8.3, 'AUDI': 7.9, 'PORSCHE': 9.2} >>> >>> print(cars.setdefault('BMW', 3.4)) 8.5 >>> cars {'BMW': 8.5, 'BENS': 8.3, 'AUDI': 7.9, 'PORSCHE': 9.2} >>>
fromkeys() 方法使用給定的多個 key 建立字典,這些 key 對應的 value 默認都是 None;也能夠額外傳入一個參數做爲默認的 value。該方法通常不會使用字典對象調用(沒什麼意義),一般會使用 dict 類直接調用。例如以下代碼:
# 使用列表建立包含2個key的字典 a_dict = dict.fromkeys(['a', 'b']) print(a_dict) # {'a': None, 'b': None} # 使用元組建立包含2個key的字典 b_dict = dict.fromkeys((13, 17)) print(b_dict) # {13: None, 17: None} # 使用元組建立包含2個key的字典,指定默認的value c_dict = dict.fromkeys((13, 17), 'good') print(c_dict) # {13: 'good', 17: 'good'}
在格式化字符串時,若是要格式化的字符串模板中包含多個變量,後面就須要按順序給出多個變量,這種方式對於字符串模板中包含少許變量的情形是合適的,但若是字符串模板中包含大量變量,這種按順序提供變量的方式則有些不合適。可改成在字符串模板中按 key 指定變量,而後經過字典爲字符串模板中的 key 設置值。
>>> temp = '教程是:%(name)s, 價格是:%(price)010.2f, 出版社是:%(publish)s' >>> book = {'name':'Python基礎教程', 'price': 99, 'publish': 'C語言中文網'} >>> print(temp%book) 教程是:Python基礎教程, 價格是:0000099.00, 出版社是:C語言中文網 >>> book = {'name':'C語言小白變怪獸', 'price':159, 'publish': 'C語言中文網'} >>> print(temp%book) 教程是:C語言小白變怪獸, 價格是:0000159.00, 出版社是:C語言中文網 >>>