我們知道,Python 字典的數據類型為 dict,我們可使用 dir(dict) 來查看該類型包含哪些方法,例如:
>>> dir(dict)
['clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']
這些方法中,fromkeys() 和 get() 的用法已在《Python字典》中進行了介紹,這裡不再贅述,本節只給大家介紹剩下的方法。
將這三個方法放在一起介紹,是因為它們都用來獲取字典中的特定數據:
keys() 方法用於返回字典中的所有鍵(key);
values() 方法用於返回字典中所有鍵對應的值(value);
items() 用於返回字典中所有的鍵值對(key-value)。
請看下面的例子:
scores = {'數學': 95, '語文': 89, '英語': 90}print(scores.keys())print(scores.values())print(scores.items())運行結果:
dict_keys(['數學', '語文', '英語'])
dict_values([95, 89, 90])
dict_items([('數學', 95), ('語文', 89), ('英語', 90)])可以發現,keys()、values() 和 items() 返回值的類型分別為 dict_keys、dict_values 和 dict_items。
需要注意的是,在 Python 2.x 中,上面三個方法的返回值都是列表(list)類型。但在 Python 3.x 中,它們的返回值並不是我們常見的列表或者元組類型,因為 Python 3.x 不希望用戶直接操作這幾個方法的返回值。
在 Python 3.x 中如果想使用這三個方法返回的數據,一般有下面兩種方案:
1) 使用 list() 函數,將它們返回的數據轉換成列表,例如:a = {'數學': 95, '語文': 89, '英語': 90}b = list(a.keys())print(b)運行結果為:
['數學', '語文', '英語']
2) 使用 for in 循環遍歷它們的返回值,例如:a = {'數學': 95, '語文': 89, '英語': 90}for k in a.keys(): print(k,end=' ')print("\n")for v in a.values(): print(v,end=' ')print("\n")for k,v in a.items(): print("key:",k," value:",v)運行結果為:
數學 語文 英語
copy() 方法
95 89 90
key: 數學 value: 95
key: 語文 value: 89
key: 英語 value: 90copy() 方法返回一個字典的拷貝,也即返回一個具有相同鍵值對的新字典,例如:
a = {'one': 1, 'two': 2, 'three': [1,2,3]}b = a.copy()print(b)運行結果為:
{'one': 1, 'two': 2, 'three': [1, 2, 3]}
可以看到,copy() 方法將字典 a 的數據全部拷貝給了字典 b。
注意,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['four']=100print(a)print(b)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]}
{'one': 1, 'two': 2, 'three': [2, 3], 'four': 100}
{'one': 1, 'two': 2, 'three': [2, 3]}從運行結果不難看出,對 a 增加新鍵值對,b 不變;而修改 a 某鍵值對中列表內的元素,b也會相應改變。
update() 方法update() 方法可以使用一個字典所包含的鍵值對來更新己有的字典。
在執行 update() 方法時,如果被更新的字典中己包含對應的鍵值對,那麼原 value 會被覆蓋;如果被更新的字典中不包含對應的鍵值對,則該鍵值對被添加進去。
請看下面的代碼:a = {'one': 1, 'two': 2, 'three': 3}a.update({'one':4.5, 'four': 9.3})print(a)運行結果為:
{'one': 4.5, 'two': 2, 'three': 3, 'four': 9.3}
從運行結果可以看出,由於被更新的字典中已包含 key 為「one」的鍵值對,因此更新時該鍵值對的 value 將被改寫;而被更新的字典中不包含 key 為「four」的鍵值對,所以更新時會為原字典增加一個新的鍵值對。
pop() 和 popitem() 方法pop() 和 popitem() 都用來刪除字典中的鍵值對,不同的是,pop() 用來刪除指定的鍵值對,而 popitem() 用來隨機刪除一個鍵值對,它們的語法格式如下:
dictname.pop(key)
dictname.popitem()其中,dictname 表示字典名稱,key 表示鍵。
下面的代碼演示了兩個函數的用法:a = {'數學': 95, '語文': 89, '英語': 90, '化學': 83, '生物': 98, '物理': 89}print(a)a.pop('化學')print(a)a.popitem()print(a)運行結果:
{'數學': 95, '語文': 89, '英語': 90, '化學': 83, '生物': 98, '物理': 89}
對 popitem() 的說明
{'數學': 95, '語文': 89, '英語': 90, '生物': 98, '物理': 89}
{'數學': 95, '語文': 89, '英語': 90, '生物': 98}其實,說 popitem() 隨機刪除字典中的一個鍵值對是不準確的,雖然字典是一種無須的列表,但鍵值對在底層也是有存儲順序的,popitem() 總是彈出底層中的最後一個 key-value,這和列表的 pop() 方法類似,都實現了數據結構中「出棧」的操作。
setdefault() 方法setdefault() 方法用來返回某個 key 對應的 value,其語法格式如下:
dictname.setdefault(key, defaultvalue)
說明,dictname 表示字典名稱,key 表示鍵,defaultvalue 表示默認值(可以不寫,不寫的話是 None)。
當指定的 key 不存在時,setdefault() 會先為這個不存在的 key 設置一個默認的 defaultvalue,然後再返回 defaultvalue。
也就是說,setdefault() 方法總能返回指定 key 對應的 value:
請看下面的代碼:a = {'數學': 95, '語文': 89, '英語': 90}print(a)a.setdefault('物理', 94)print(a)a.setdefault('化學')print(a)a.setdefault('數學', 100)print(a)運行結果為:
{'數學': 95, '語文': 89, '英語': 90}
{'數學': 95, '語文': 89, '英語': 90, '物理': 94}
{'數學': 95, '語文': 89, '英語': 90, '物理': 94, '化學': None}
{'數學': 95, '語文': 89, '英語': 90, '物理': 94, '化學': None}