- Python3.5從零開始學
- 劉宇宙
- 2345字
- 2020-11-28 16:07:05
5.2 創建和使用字典
字典的創建格式如下:
>>> d = {key1 : value1, key2 : value2 }
字典由多個鍵及其對應的值構成的對組成(把鍵/值對稱為項)。字典的每個鍵/值(key/value)對用冒號(:)分割,每個項之間用逗號(,)分割,整個字典包括在花括號({})中。空字典(不包括任何項)由兩個大括號組成,如{}。
鍵必須是唯一的,但值不必。值可以取任何數據類型,鍵必須是不可變的,如字符串、數字或元組。
下面是一個簡單的字典示例:
>>> dict = {’小萌’: '1001', ’小智’: '1002', ’小強’: '1003'}
也可以為如下形式:
>>> dict1 = { 'abc': 456 } >>> dict2 = { 'abc': 123, 98.6: 37 }
5.2.1 dict函數
可以用dict函數,通過其他映射(如其他字典)或鍵/值序列對建立字典,例如:
>>> student=[('name', ’小萌’), ('number', '1001')] >>> detail=dict(student) >>> print(’學生詳細信息:', detail) 學生詳細信息: {'name':’小萌’,'number':'1001'} >>> print(’學生姓名:', detail['name']) 學生姓名: 小萌 >>> print(’學生學號:', detail['number']) 學生學號: 1001
由輸出結果看到,dict函數可以將序列轉換為字典。字典的操作很簡單,在5.1節期望的功能已經實現了。
dict函數可以通過關鍵字參數創建字典,例如:
>>> detail=dict(name=’小智’, number='1002') >>> print(’學生詳細信息:', detail) 學生詳細信息: {'name':’小智’,'number':'1002'}
由輸出結果看到,通過關鍵字參數創建了字典。
通過關鍵字創建字典功能是dict函數非常有用的一個功能,可以多加運用。
5.2.2 字典的基本操作
字典的基本操作在很多方面與序列(sequence)類似,支持修改、刪除等操作。下面進行具體的講解。
1.修改字典
向字典添加新內容的方法是增加新鍵/值對,修改或刪除已有鍵/值對,例如:
>>> student={’小萌’:'1001', ’小智’:'1002', ’小強’:'1003'} >>>student[’小強’]='1005' #更新小強的學號 >>> print(’小強的學號是:%(小強)s' % student) 小強的學號是:1005 >>> student[’小張’]='1006' #添加一個學生 >>>print(’小張的學號是:%(小張)s'% student) 小張的學號是:1006
由輸出結果看到,修改和添加均操作成功。
2.刪除字典元素
此處的刪除指的是顯式刪除,顯式刪除一個字典用del命令,例如:
>>> student={’小強’: '1005', ’小萌’: '1001', ’小智’: '1002', ’小張’: '1006'} >>> print(’刪除前:', student) 刪除前: {’小強’: '1005', ’小萌’: '1001', ’小智’: '1002', ’小張’: '1006'} >>> del student[’小張’] #刪除鍵“小張” >>> print(’刪除后:', student) 刪除后: {’小強’: '1005', ’小萌’: '1001', ’小智’: '1002'}
由輸出結果看到對應鍵/值被正確刪除了。
除了刪除鍵,還可以刪除整個字典,例如:
>>> student={’小強’: '1005', ’小萌’: '1001', ’小智’: '1002', ’小張’: '1006'} >>> print(’刪除前:', student) 刪除前: {’小強’: '1005', ’小萌’: '1001', ’小智’: '1002', ’小張’: '1006'} >>>del student #刪除字典 >>> print(’刪除后:', student) Traceback (most recent call last): File "<pyshell#70>", line 1, in <module> print(’刪除后:', student) NameError: name 'student' is not defined
由輸出結果看到,刪除字典后就不能對字典進行訪問了,因為執行del操作后字典就不存在了,因而會報變量沒有定義的錯誤。
3.字典鍵的特性
字典值可以沒有限制地取任何Python對象,既可以是標準對象,也可以是用戶定義的對象,但鍵不行。
需要記住以下兩點:
(1)不允許同一個鍵出現兩次。創建時如果同一個鍵被賦值兩次,后面的值會被記住,例如:
>>> student={’小萌’: '1001', ’小智’: '1002', ’小萌’: '1005'} >>> print(’學生信息:', student) 學生信息: {’小萌’:'1005',’小智’:'1002'}
由輸出結果看到,一個鍵被賦值兩次,后面的值會被記住。(2)鍵必須不可變,可以用數字、字符串或元組充當,不能用列表,例如:
>>> field={['name']:’小萌’, 'number':'1001'} Traceback (most recent call last): File "<pyshell#80>", line 1, in <module> field={['name']:’小萌’, 'number':'1001'} TypeError: unhashable type: 'list'
由輸出結果看到,不能用列表做鍵,會提示類型錯誤。
4. len函數
len(dict)函數用于計算字典元素的個數,即鍵的總數,例如:
>>> student={’小萌’: '1001', ’小智’: '1002', ’小強’: '1005', ’小張’: '1006'} >>> print(’字典元素個數為:%d個’ % len(student)) 字典元素個數為:4個
輸出結果得到字典元素的個數為4。
5. type函數
type(variable)函數返回輸入的變量類型,如果輸入變量是字典就返回字典類型,例如:
>>> student={’小萌’: '1001', ’小智’: '1002', ’小強’: '1005', ’小張’: '1006'} >>> print(’字典的類型為:', type(student)) 字典的類型為: <class'dict'>
輸出結果為字典(dict)類型。
5.2.3 字典的格式化字符串
在第4章我們已經見過如何使用字符串格式化功能格式化元組中的所有值。如果使用字典(只以字符串作為鍵)而不是元組做這項工作,會使字符串格式化更有趣一些,例如:
>>> student={’小萌’:'1001', ’小智’:'1002', ’小強’:'1003'} >>> print(’小強的學號是:%(小強)s' % student) 小強的學號是:1003
由操作結果看到,字典的格式化方式是在每個轉換說明符中的%字符后加上用圓括號括起來的鍵,再跟上其他說明元素。
字典的格式化除了增加字符串鍵外,轉換說明符還像以前一樣工作。以這種方式使用字典時,只要所有給出的鍵都能在字典中找到,就可以獲得任意數量的轉換說明符。
5.2.4 字典和列表的區別
例如,以一個名字查找對應的學號。
如果用list實現,就要先在名字列表中找到對應的名字,再從學號列表取出對應的學號,list越長耗時越長。如果用dict實現,只需要一個名字和學號的對照表,就可以直接根據名字查找學號,無論這個表有多大,查找速度都不會變慢。
為什么dict查找速度這么快?
因為dict的實現原理和查字典一樣。假設字典包含10000個漢字,我們要查某一個字,一種方法是把字典從第一頁往后翻,直到找到我們想要的字為止,這種方法是在list中查找元素,list越大查找越慢。另一種方法是在字典的索引表里(如部首表)查這個字對應的頁碼,然后直接翻到該頁找到這個字。無論找哪個字,這種查找速度都非常快,不會隨著字典大小的增加而變慢。
dict就是第二種實現方法,給定一個名字,比如我們要查找5.2.3小節示例中“小萌”的學號,在dict內部就可以直接計算出“小萌”存放學號的“頁碼”,也就是1001存放的內存地址,直接取出來即可,所以速度非常快。
綜上所述,list和dict各有以下幾個特點:
dict的特點是:
(1)查找和插入的速度極快,不會隨著key的增加而變慢。
(2)需要占用大量內存,內存浪費多。
list的特點是:
(1)查找和插入時間隨著元素的增加而增加。
(2)占用空間小,浪費內存很少。
所以,dict是使用空間換取時間。
dict可以用在很多需要高速查找的地方,在Python代碼中幾乎無處不在,正確使用dict非常重要,需要牢記dict的鍵必須是不可變對象。
注意 dict內部存放的順序和鍵放入的順序沒有關系。
- Web程序設計及應用
- 自制編譯器
- Android Jetpack開發:原理解析與應用實戰
- Microsoft Application Virtualization Cookbook
- 自己動手實現Lua:虛擬機、編譯器和標準庫
- WebAssembly實戰
- Scratch真好玩:教小孩學編程
- Blender 3D Incredible Machines
- Python自然語言處理(微課版)
- INSTANT OpenNMS Starter
- Haxe Game Development Essentials
- Mathematica Data Analysis
- Asynchronous Android Programming(Second Edition)
- 劍指大數據:企業級數據倉庫項目實戰(在線教育版)
- Mastering Linux Security and Hardening