python內建物件型別(四)序列之dict字典

Eniac-W發表於2020-10-31

字典的相關定義

Python 字典是一種無序的、可變的序列,元素以“鍵值對(key-value)”形式儲存
而列表(list)和元組(tuple)都是有序的序列(這裡的有序不是說他們的元素大小是有序排列的的,而是說它們的元素在記憶體是連續挨著存放的,通常將索引值為0的元素稱為第一個元素。)

字典型別是 Python 中唯一的對映型別

在這裡插入圖片描述

一、字典的建立

鍵必須不同,但是不同的鍵的值可以一樣
鍵只能是整數、字串或者元組這些唯一和不可變的型別,因此列表不能做鍵
值可以是 Python 支援的任意資料型別和自定義型別。

需要注意的是字典裡面沒有要求所有的key或者所有的value 的型別都一樣,即不要求所有的鍵的型別都一樣,也不要求所有val的值都一樣,這一點和列表、元組一樣,即不要求所存的資料的型別一致(是個筐 什麼都能裝)

鍵或者值是字串/字元時需要有引號(單雙都可以)

方法一、使用 { } 建立字典
鍵和值之間使用冒號:分隔,相鄰元素之間使用逗號,分隔,所有元素放在大括號{ }中

#使用字串作為key
scores = {'數學': 95, '英語': 92, '語文': 84}
print(scores)

使用元組和數字作為key  兩個key的型別分別是元組和數字 val分別是字串和列表
dict1 = {(20, 30): 'great', 30: [1,2,3]}
print(dict1)

#建立空元組
dict2 = {}
print(dict2)

執行結果
{'數學': 95, '英語': 92, '語文': 84}
{(20, 30): 'great', 30: [1, 2, 3]}
{}

方法二、 內建函式dict()建立
通過dict()函式建立字典的寫法可以如下
在這裡插入圖片描述
方法三、 dict 字典型別提供的 fromkeys() 方法建立帶有預設值的字典
具體格式為:
dictname = dict.fromkeys(list,value=None)
list 參數列示字典中所有鍵的列表(list)
value 參數列示預設值,如果不寫則為空值 None

knowledge = ['語文', '數學', '英語']
scores = dict.fromkeys(knowledge, 60)
print(scores)

執行結果
{'語文': 60, '英語': 60, '數學': 60}
該方法通常用於字典的初始化

二、字典的訪問

方法一、通過鍵訪問 :dictname[key]
訪問時鍵必須是存在的否則會丟擲異常,程式終止

列表和元組是通過下標來訪問元素,而字典通過鍵來訪問對應的值,因為字典中的元素是無序的,每個元素的位置都不固定,所以字典也不能像列表和元組那樣,採用切片的方式一次性訪問多個元素

方法二、通過dict的get(key)方法訪問(推薦):dictname.get(key[,default])
當指定的鍵不存在時不會丟擲異常
dictname 表示字典變數的名字;key 表示指定的鍵;default 用於指定要查詢的鍵不存在時,此方法返回的預設值,如果不手動指定,會返回 None,如果想明確地提示該鍵不存在,那麼可以手動設定 get() 的第二個引數

get(key)方法返回對應key 的值 當key不存在返回系統預設的None或者我們自己指定的第二個引數get不會修改原字典

a = dict(two=0.65, one=88, three=100, four=-59)
print( a.get('one') )
print( a.get('five', '該鍵不存在') )
del(a);
執行結果
88
該鍵不存在

區分dict的setdefault(key[,default])方法 在key不存在時會修改原來的字典
若key存在返回其值
若key不存在且沒有指定預設值在字典中插入<key,None>鍵值對
若key不存在且指定了預設值defaultValue在字典中插入<key,defaultValue>鍵值對

在這裡插入圖片描述
在這裡插入圖片描述

Python 自帶垃圾回收功能,會自動銷燬不用的字典,所以一般不需要通過 del 來刪除

三、字典的基本操作

字典是可變序列 因此可以:
1、dictname[key] = value:向現有字典中新增新的鍵值對,key必須在現有鍵中不存在
也可以使用字典提供的update()方法

2、修改現有字典中的鍵值對,這裡指的是修改值(value)鍵不可修改
字典中各元素的鍵必須是唯一的,因此,如果新新增元素的鍵與已存在元素的鍵相同,那麼鍵所對應的值就會被新的值替換掉,以此達到修改元素值的目的
也可以使用字典提供的pop(key)方法

a = {'數學': 95, '語文': 89, '英語': 90}
print(a)
a['語文'] = 100
print(a)

3、del dictName[key] 刪除字典中鍵為key的鍵值對

4、key in dicName 檢查某個鍵key是否在字典中 注意只能檢查key是否存在 不能檢查val,判斷現有字典中是否存在指定的鍵值對。

5、len(dicName) 求字典中鍵值對的個數

四、字典的常用方法

在這裡插入圖片描述

1、get(key[,default]):獲取key的val或預設值
2、setdefault(key[,default]):獲取key的val或新增預設鍵值對

3、update():增加鍵值對
如果被更新的字典中己包含對應的鍵值對,那麼原 value 會被覆蓋
如果被更新的字典中不包含對應的鍵值對,則該鍵值對被新增進去

傳入的引數可以是一個字典;也可以是一個元組或列表,而它們中的元素又是隻包含兩個元素的元組或列表,這和通過dict建立列表是一致的

a = {'one': 1, 'two': 2, 'three': 3}
a.update({'one':4.5, 'four': 9.3})
print(a)
a.update([('course','語文'),('name','Eniac'),(10,'me')]);
print(a)

執行結果
{'one': 4.5, 'two': 2, 'three': 3, 'four': 9.3}  修改one 新增four
{'one': 4.5, 'two': 2, 'three': 3, 'four': 9.3, 
 'course': 'english', 'name': 'Eniac', 10: 1}  
傳入列表 列表元素是元組 各個元組的元素型別(key和val)不一樣

4、pop(key[,d]):刪除鍵值對
若key存在,刪除鍵值對並返回該key對應的val
若key不存在且給出了引數d 返回d
若key不存在且沒有給出了引數d程式異常終止KeyError
在這裡插入圖片描述5、popitem() 刪除字典最後一對鍵值對並返回該鍵值對 若字典為空異常終止KeyError
該方法在python3.6以後適用,之前是隨機刪除一對鍵值對,需要注意的是即使如此字典也不是有序的,這裡所指的最後一個是指字典建立時鍵值對新增進字典的順序(即儲存鍵值對的底層資料結構的最後一個)

6、獲取字典中的特定資料的三個方法:
keys() 方法用於返回字典中的所有鍵(key)
values() 方法用於返回字典中所有鍵對應的值(value)
items() 用於返回字典中所有的鍵值對(key-value)

7、copy() :返回一個字典的拷貝,也即返回一個具有相同鍵值對的新字典,
copy() 方法所遵循的拷貝原理既有深拷貝,也有淺拷貝。
拿拷貝字典 a 為例,copy() 方法只會對最表層的鍵值對進行深拷貝,也就是說,它會再申請一塊記憶體用來存放 {‘one’: 1, ‘two’: 2, ‘three’: []};而對於某些列表型別的值來說,此方法對其做的是淺拷貝,也就是說,b 中的 [1,2,3] 的值不是自己獨有,而是和 a 共有。

a = {'one': 1, 'two': 2, 'three': [1,2,3]}
b = a.copy()
向 a 中新增新鍵值對,由於b已經提前將 a 所有鍵值對都深拷貝過來,因此 a 新增新鍵值對,不會影響b。
a['four']=100
print(a)
print(b)

由於 b 和 a 共享[1,2,3](淺拷貝),因此移除 a 中列表中的元素,也會影響 b。
這裡鍵three是一個列表,remove(val)刪除列表中特定值為val的元素 區分列表的pop(index)刪除
a['three'].remove(1)  
print(a)
print(b)

執行結果
{'one': 1, 'two': 2, 'three': [1, 2, 3], 'four': 100}
{'one': 1, 'two': 2, 'three': [1, 2, 3]}    b沒變
{'one': 1, 'two': 2, 'three': [2, 3], 'four': 100}  a b都變了
{'one': 1, 'two': 2, 'three': [2, 3]}

相關文章