- Python從入門到精通
- 明日科技
- 4445字
- 2019-12-06 14:16:32
6.1 字典
字典(dictionary)和列表類似,也是可變序列,不過與列表不同,它是無序的可變序列,保存的內容是以“鍵-值對”的形式存放的。這類似于《新華字典》,它可以把拼音和漢字關聯起來。通過音節表可以快速找到想要的漢字。其中,《新華字典》里的音節表相當于鍵(key),而對應的漢字相當于值(value)。鍵是唯一的,而值可以有多個。字典在定義一個包含多個命名字段的對象時,很有用。
說明
Python中的字典相當于Java或者C++中的Map對象。
字典的主要特征如下。
通過鍵而不是通過索引來讀取
字典有時也稱為關聯數組或者散列表(hash)。它是通過鍵將一系列的值聯系起來的,這樣就可以通過鍵從字典中獲取指定項,但不能通過索引來獲取。
字典是任意對象的無序集合
字典是無序的,各項是從左到右隨機排序的,即保存在字典中的項沒有特定的順序。這樣可以提高查找順序。
字典是可變的,并且可以任意嵌套
字典可以在原處增長或者縮短(無須生成一份拷貝),并且它支持任意深度的嵌套(即它的值可以是列表或者其他的字典)。
字典中的鍵必須唯一
不允許同一個鍵出現兩次,如果出現兩次,則后一個值會被記住。
字典中的鍵必須不可變
字典中的鍵是不可變的,所以可以使用數字、字符串或者元組,但不能使用列表。
6.1.1 字典的創建和刪除
定義字典時,每個元素都包含兩個部分——“鍵”和“值”,并且在“鍵”和“值”之間使用冒號分隔,相鄰兩個元素使用逗號分隔,所有元素放在一個大括號“{}”中。語法格式如下:
dictionary = {'key1':'value1', 'key2':'value2', ..., 'keyn':'valuen',}
參數說明如下:
dictionary:表示字典名稱;
key1, key2, ..., keyn:表示元素的鍵,必須是唯一的,并且不可變,例如可以是字符串、數字或者元組;
value1, value2, ..., valuen:表示元素的值,可以是任何數據類型,不是必須唯一。
例如,創建一個保存通訊錄信息的字典,可以使用下面的代碼。
01 dictionary = {'qq':'84978981','明日科技':'84978982','無語':'0431-84978981'} 02 print(dictionary)
執行結果如下:
{'qq': '84978981', '明日科技': '84978982', '無語': '0431-84978981'}
同列表和元組一樣,也可以創建空字典。在Python中,可以使用下面兩種方法創建空字典。
dictionary = {}
或者
dictionary = dict()
Python的dict()方法除了可以創建一個空字典外,還可以通過已有數據快速創建字典。主要表現為以下兩種形式。
1.通過映射函數創建字典
語法如下:
dictionary = dict(zip(list1,list2))
參數說明如下:
dictionary:表示字典名稱。
zip()函數:用于將多個列表或元組對應位置的元素組合為元組,并返回包含這些內容的zip對象。如果想得到元組,可以將zip對象使用tuple()函數轉換為元組;如果想得到列表,則可以使用list()函數將其轉換為列表。
說明
在Python 2.x中,zip()函數返回的內容為包含元組的列表。
list1:表示一個列表,用于指定要生成字典的鍵。
list2:表示一個列表,用于指定要生成字典的值。如果list1和list2的長度不同,則與最短的列表長度相同。
場景模擬:某大學的寢室里住著4位清秀可人的美女,她們的名字保存在一個列表中,另外,她們每個人的星座對應著保存在另一個列表中。
【例6.1】 根據名字和星座創建一個字典。(實例位置:資源包\TM\sl\06\01)
在IDLE中創建一個名稱為sign_create.py的文件,然后在該文件中定義兩個包括4個元素的列表,再應用dict()函數和zip()函數將前兩個列表轉換為對應的字典,并且輸出該字典,代碼如下:

運行代碼后,將顯示如圖6.1所示的結果。

圖6.1 創建字典
2.通過給定的“鍵-值對”創建字典
語法如下:
dictionary = dict(key1=value1,key2=value2,...,keyn=valuen)
參數說明如下:
dictionary:表示字典名稱;
key1, key2, ..., keyn:表示元素的鍵,必須是唯一的,并且不可變,例如可以是字符串、數字或者元組;
value1, value2, ..., valuen:表示元素的值,可以是任何數據類型,不是必須唯一。
例如,將實例6.1中的名字和星座通過“鍵-值對”的形式創建一個字典,可以使用下面的代碼。
01 dictionary =dict(綺夢 = '水瓶座', 冷伊一 = '射手座', 香凝 = '雙魚座', 黛蘭 = '雙子座') 02 print(dictionary)
在Python中,還可以使用dict對象的fromkeys()方法創建值為空的字典,語法如下:
dictionary = dict.fromkeys(list1)
參數說明如下:
dictionary:表示字典名稱;
list1:作為字典的鍵的列表。
例如,創建一個只包括名字的字典,可以使用下面的代碼。

執行結果如下。
{'綺夢': None, '冷伊一': None, '香凝': None, '黛蘭': None}
另外,還可以通過已經存在的元組和列表創建字典。例如,創建一個保存名字的元組和保存星座的列表,通過它們創建一個字典,可以使用下面的代碼。

執行結果如下:
{('綺夢', '冷伊一', '香凝', '黛蘭'): ['水瓶座', '射手座', '雙魚座', '雙子座']}
如果將作為鍵的元組修改為列表,再創建一個字典,代碼如下:

執行結果如圖6.2所示。

圖6.2 將列表作為字典的鍵產生的異常
同列表和元組一樣,不再需要的字典也可以使用del命令刪除。例如,通過下面的代碼即可將已經定義的字典刪除。
del dictionary
另外,如果只是想刪除字典的全部元素,可以使用字典對象的clear()方法。執行clear()方法后,原字典將變為空字典。例如,下面的代碼將清除字典的全部元素。
dictionary.clear()
除了上面介紹的方法可以刪除字典元素,還可以使用字典對象的pop()刪除并返回指定“鍵”的元素,以及使用字典對象的popitem()方法刪除并返回字典中的一個元素。
6.1.2 訪問字典
在Python中,如果想將字典的內容輸出也比較簡單,可以直接使用print()函數。例如,要想打印實例6.1中定義的dictionary字典,則可以使用下面的代碼。
print(dictionary)
執行結果如下:
{'綺夢': '水瓶座', '冷伊一': '射手座', '香凝': '雙魚座', '黛蘭': '雙子座'}
但是,在使用字典時,很少直接輸出它的內容。一般需要根據指定的鍵得到相應的結果。在Python中,訪問字典的元素可以通過下標的方式實現,與列表和元組不同,這里的下標不是索引號,而是鍵。例如,想要獲取“冷伊一”的星座,可以使用下面的代碼。
print(dictionary['冷伊一'])
執行結果如下:
射手座
在使用該方法獲取指定鍵的值時,如果指定的鍵不存在,將拋出如圖6.3所示的異常。

圖6.3 獲取指定鍵不存在時拋出異常
在實際開發中,很可能我們不知道當前存在什么鍵,所以需要避免該異常的產生。具體的解決方法是使用if語句對不存在的情況進行處理,即給一個默認值。例如,可以將上面的代碼修改為以下內容。
print("冷伊的星座是:",dictionary['冷伊'] if '冷伊' in dictionary else '我的字典里沒有此人')
當“冷伊”不存在時,將顯示以下內容。
冷伊的星座是:我的字典里沒有此人
另外,Python中推薦的方法是使用字典對象的get()方法獲取指定鍵的值。其語法格式如下:
dictionary.get(key[,default])
其中,dictionary為字典對象,即要從中獲取值的字典;key為指定的鍵;default為可選項,用于當指定的鍵不存在時,返回一個默認值,如果省略,則返回None。
例如,通過get()方法獲取“冷伊一”的星座,可以使用下面的代碼。
print("冷伊一的星座是:",dictionary.get('冷伊一'))
執行結果如下。
冷伊一的星座是: 射手座
說明
為了解決在獲取指定鍵的值時,因不存在該鍵而導致拋出異常,可以為get()方法設置默認值,這樣當指定的鍵不存在時,得到結果就是指定的默認值。例如,將上面的代碼修改為以下內容。
print("冷伊的星座是:",dictionary.get('冷伊','我的字典里沒有此人'))
將得到以下結果。
冷伊的星座是:我的字典里沒有此人
場景模擬:仍然是某大學寢室里的4位美女,這次將她們的名字和星座保存在一個字典里,然后再定義一個保存各個星座性格特點的字典,根據這兩個字典取出某位美女的性格特點。
【例6.2】 根據星座測試性格特點。(實例位置:資源包\TM\sl\06\02)
在IDLE中創建一個名稱為sign_get.py的文件,然后在該文件中創建兩個字典,一個保存名字和星座,另一個保存星座和性格特點,最后從這兩個字典中取出相應的信息組合出想要的結果,并輸出,代碼如下:

運行代碼后,將顯示如圖6.4所示的結果。

圖6.4 輸出某人的星座和性格特點
6.1.3 遍歷字典
字典是以“鍵-值對”的形式存儲數據的,所以就可能需要對這些“鍵-值對”進行獲取。Python提供了遍歷字典的方法,通過遍歷可以獲取字典中的全部“鍵-值對”。
使用字典對象的items()方法可以獲取字典的“鍵-值對”列表。其語法格式如下:
dictionary.items()
其中,dictionary為字典對象;返回值為可遍歷的“鍵-值對”元組列表。想要獲取到具體的“鍵-值對”,可以通過for循環遍歷該元組列表。
例如,定義一個字典,然后通過items()方法獲取“鍵-值對”的元組列表,并輸出全部“鍵-值對”,代碼如下:
01 dictionary = {'qq':'84978981','明日科技':'84978982','無語':'0431-84978981'} 02 for item in dictionary.items(): 03 print(item)
執行結果如下:
('qq', '84978981') ('明日科技', '84978982') ('無語', '0431-84978981')
上面的示例得到的是元組中的各個元素,如果想要獲取到具體的每個鍵和值,可以使用下面的代碼進行遍歷。
01 dictionary = {'qq':'4006751066','明日科技':'0431-84978982','無語':'0431-84978981'} 02 for key,value in dictionary.items(): 03 print(key,"的聯系電話是",value)
執行結果如下:
qq的聯系電話是 4006751066 明日科技 的聯系電話是 0431-84978982 無語 的聯系電話是 0431-84978981
說明
在Python中,字典對象還提供了values()和keys()方法,用于返回字典的“值”和“鍵”列表,它們的使用方法同items()方法類似,也需要通過for循環遍歷該字典列表,獲取對應的值和鍵。
6.1.4 添加、修改和刪除字典元素
由于字典是可變序列,所以可以隨時在其中添加“鍵-值對”,這和列表類似。向字典中添加元素的語法格式如下:
dictionary[key] = value
參數說明如下:
dictionary:表示字典名稱;
key:表示要添加元素的鍵,必須是唯一的,并且不可變,例如可以是字符串、數字或者元組;
value:表示元素的值,可以是任何數據類型,不是必須唯一。
例如,還是以之前的保存4位美女星座的場景為例,在創建的字典中添加一個元素,并顯示添加后的字典,代碼如下:
01 dictionary =dict((('綺夢', '水瓶座'),('冷伊一','射手座'), ('香凝','雙魚座'), ('黛蘭','雙子座'))) 02 dictionary["碧琦"] = "巨蟹座" # 添加一個元素 03 print(dictionary)
執行結果如下:
{'綺夢': '水瓶座', '冷伊一': '射手座', '香凝': '雙魚座', '黛蘭': '雙子座', '碧琦': '巨蟹座'}
從上面的結果中,可以看出又添加了一個鍵為“碧琦”的元素。
由于在字典中,“鍵”必須是唯一的,所以如果新添加元素的“鍵”與已經存在的“鍵”重復,那么將使用新的“值”替換原來該“鍵”的值,這也相當于修改字典的元素。例如,再添加一個“鍵”為“香凝”的元素,這次設置她為“天蝎座”。可以使用下面的代碼。
01 dictionary =dict((('綺夢', '水瓶座'),('冷伊一','射手座'), ('香凝','雙魚座'), ('黛蘭','雙子座'))) 02 dictionary["香凝"] = "天蝎座" # 添加一個元素,當元素存在時,則相當于修改功能 03 print(dictionary)
執行結果如下:
{'綺夢': '水瓶座', '冷伊一': '射手座', '香凝': '天蝎座', '黛蘭': '雙子座'}
從上面的結果可以看出,并沒有添加一個新的“鍵”為“香凝”的元素,而是直接對“香凝”進行了修改。
當字典中的某個元素不需要時,可以使用del命令將其刪除。例如,要刪除字典dictionary的鍵為“香凝”的元素,可以使用下面的代碼。
01 dictionary =dict((('綺夢', '水瓶座'),('冷伊一','射手座'), ('香凝','雙魚座'), ('黛蘭','雙子座'))) 02 del dictionary["香凝"] # 刪除一個元素 03 print(dictionary)
執行結果如下:
{'綺夢': '水瓶座', '冷伊一': '射手座', '黛蘭': '雙子座'}
從上面的執行結果中可以看到,在字典dictionary中只剩下3個元素了。
注意
當刪除一個不存在的鍵時,將拋出如圖6.5所示的異常。

圖6.5 刪除一個不存在的鍵時將拋出的異常
因此,需要將上面的代碼修改為以下內容,從而防止刪除不存在的元素時拋出異常。

6.1.5 字典推導式
使用字典推導式可以快速生成一個字典,它的表現形式和列表推導式類似。例如,我們可以使用下面的代碼生成一個包含4個隨機數的字典,其中字典的鍵使用數字表示。

執行結果如下:
生成的字典為: {1: 21, 2: 85, 3: 11, 4: 65}
另外,使用字典推導式也可根據列表生成字典。例如,可以將實例6.2修改為通過字典推導式生成字典。
【例6.3】 根據名字和星座創建一個字典(副本)。(實例位置:資源包\TM\sl\06\03)
在IDLE中創建一個名稱為sign_create.py的文件,然后在該文件中定義兩個包括4個元素的列表,再應用dict()函數和zip()函數將兩個列表轉換為對應的字典,并且輸出該字典,代碼如下:

運行代碼后,將顯示如圖6.6所示的結果。

圖6.6 采用字典推導式創建字典
- Hands-On Machine Learning with scikit:learn and Scientific Python Toolkits
- C/C++常用算法手冊(第3版)
- 零基礎學Java程序設計
- Mastering Python Networking
- 算法訓練營:提高篇(全彩版)
- Oracle Exadata專家手冊
- PySpark Cookbook
- Java實戰(第2版)
- OpenResty完全開發指南:構建百萬級別并發的Web應用
- Mastering Docker
- LabVIEW數據采集
- Elastix Unified Communications Server Cookbook
- HTML5程序設計基礎教程
- Socket.IO Cookbook
- Build Your Own PaaS with Docker