字典dict詳解

字典也是 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 。
  • 經過 key 添加 key-value 對。
  • 經過 key 刪除 key-value 對。
  • 經過 key 修改 key-value 對。
  • 經過 key 判斷指定 key-value 對是否存在。
  • 經過 key 訪問 value 使用的也是方括號語法,就像前面介紹的列表和元組同樣,只是此時在方括號中放的是 key,而不是列表或元組中的索引。

以下代碼示範了經過 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()方法

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()方法

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()方法

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()

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方法

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}
>>>

popitem()方法

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()方法

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()方法

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語言中文網
>>>
相關文章
相關標籤/搜索