目錄:
一、fromkeys()
二、keys()、values()、items()
三、get()
四、copy()
五、pop()和popitem()
六、update()
七、課時26課後習題及答案
字典是Python中唯一的對映型別,字典不是序列。如果在序列中試圖為一個不存在的位置賦值時,會報錯;但是如果在字典中,會自動建立相應的鍵並新增對應的值進去。
*******************
一、fromkeys()
*******************
fromkeys()方法用於建立並返回一個新的字典,它有兩個引數:第一個引數是字典的鍵;第二個引數是可選的,是傳入鍵對應的值。如果不能提供,那麼預設是None。舉個例子:
>>> dict = {} >>> dict.fromkeys((1,2,3)) {1: None, 2: None, 3: None} >>> dict1 = {} >>> dict1.fromkeys((1,2,3)) {1: None, 2: None, 3: None} >>> dict2 = {} >>> dict2.fromkeys((1,2,3),"Number") {1: 'Number', 2: 'Number', 3: 'Number'} >>> dict3 = {} >>> dict3.fromkeys((1,2,3),("one","two","three")) {1: ('one', 'two', 'three'), 2: ('one', 'two', 'three'), 3: ('one', 'two', 'three')}
最後一個例子,告訴我們,不能想天然,fromkeys()方法並不會把'one', 'two', 'three'分別賦值給1、2和3,因為fromkeys()把('one', 'two', 'three')當成一個值了。
*******************************************
二、keys()、values()、items()
*******************************************
訪問字典的方法有:keys()、values()、items()
keys()用於返回字典中的鍵,values()用於返回字典中的所有值,那麼items()當然就是返回字典中的所有的鍵值對(也就是項)啦。舉個例子:
>>> dict1 = {} >>> dict1 = dict1.fromkeys(range(12),"贊") >>> dict1.keys() dict_keys([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]) >>> dict1.values() dict_values(['贊', '贊', '贊', '贊', '贊', '贊', '贊', '贊', '贊', '贊', '贊', '贊']) >>> dict1.items() dict_items([(0, '贊'), (1, '贊'), (2, '贊'), (3, '贊'), (4, '贊'), (5, '贊'), (6, '贊'), (7, '贊'), (8, '贊'), (9, '贊'), (10, '贊'), (11, '贊')])
字典可以很大,有些時候我們並不知道提供的項是否在字典中存在,如果不存在,Python就會報錯:
>>> print(dict1[32]) Traceback (most recent call last): File "<pyshell#20>", line 1, in <module> print(dict1[32]) KeyError: 32
*************
三、get()
*************
get()方法提供了更寬鬆的方式去訪問字典項,當鍵不存在的時候,get()方法並不會報錯,只是默默地返回了一個None,表示啥也沒找到:
>>> dict1.get(11) '贊' >>> dict1.get(12) >>>
如果希望找不到資料時返回指定的值,那麼可以在第二個引數設定對應的預設返回值:
>>> dict1.get(12,"木有") '木有'
>>> dict1.get(11,"木有")
'贊'
如果不知道一個鍵是否在字典中,那麼可以使用成員資格操作符(in或not in)來判斷:
>>> 11 in dict1 True >>> 12 in dict1 False
在字典中檢查鍵的成員資格比序列更高效,當資料規模相當大的時候,兩者的差距會很明顯(注:因為字典是採用雜湊的方法一對一找到成員,而序列則是採用迭代的方式逐個比對)。最後需要注意的一點是,這裡查詢的是鍵而不是值,但是在序列中查詢的是元素的值而不是元素的索引。
如果需要清空一個字典,則使用clear()方法:
>>> dict1 {0: '贊', 1: '贊', 2: '贊', 3: '贊', 4: '贊', 5: '贊', 6: '贊', 7: '贊', 8: '贊', 9: '贊', 10: '贊', 11: '贊'} >>> dict1.clear() >>> dict1 {}
也許你會使用變數名賦值為一個空字典的方法來清空字典,這樣做存在一定的弊端。舉個例子跟大家說說這兩種清楚方法有什麼不同:
>>> a = {"姓名":"小甲魚"} >>> b = a >>> b {'姓名': '小甲魚'} >>> a = {} >>> a {} >>> b {'姓名': '小甲魚'}
從上面的例子中,a、b指向一個字典,然後試圖通過將a重新指向一個空字典來達到清空的效果時,我們發現原來的字典並沒有被真正的清空,只是a指向了一個新的空字典而已。所以這種做法在一定條件下會留下安全隱患(例如:賬戶的資料和密碼等資料有可能會被竊取)。這裡跟前面列表那 分片拷貝小節的內容 有同樣的道理。
推薦的做法時使用clear()方法:
>>> a = {"姓名":"小甲魚"} >>> b = a >>> b {'姓名': '小甲魚'} >>> a.clear() >>> a {} >>> b {}
**************
四、copy()
**************
copy()方法時複製字典:
>>> a = {1:"one",2:"two",3:"three"} >>> b = a.copy() >>> id(a) 1939673555160 >>> id(b) 1939673621272 >>> a[1] = "four" >>> a {1: 'four', 2: 'two', 3: 'three'} >>> b {1: 'one', 2: 'two', 3: 'three'}
******************************
五、pop()和popitem()
******************************
pop()是給定鍵彈出對應的值,而popitem()是彈出一個項,這兩個比較容易:
>>> a = {1:"one",2:"two",3:"three",4:"four"} >>> a.pop(2) 'two' >>> a {1: 'one', 3: 'three', 4: 'four'} >>> a.popitem() (4, 'four') >>> a {1: 'one', 3: 'three'} >>> a.popitem() (3, 'three') >>> a {1: 'one'}
setdefault()方法和get()方法有點相似,但是setdefaul()在字典中找不到對應的鍵時會自動新增:
>>> a = {1:"one",2:"two",3:"three",4:"four"} >>> a.setdefault(3) 'three' >>> a.setdefault(5) >>> a {1: 'one', 2: 'two', 3: 'three', 4: 'four', 5: None} >>>
*****************
六、update()
*****************
update()方法可以利用它來更新字典:
>>> pets = {"米奇":"老鼠","湯姆":"貓","小白":"豬"} >>> pets.update(小白="狗") >>> pets {'米奇': '老鼠', '湯姆': '貓', '小白': '狗'}
還記得在前面埋下的伏筆嗎?在講收集函式時我們說Python還有另外一種收集方式,就是用兩個星號(**)表示。兩個星號的收集參數列示為將引數們打包成字典的形式。
收集引數有兩種打包形式:一種是以元組的形式打包,另一種則是以字典的形式打包:
>>> def test(**params): print("有%d兩個引數"%len(params)) print("它們分別是:",params) >>> test(a=1,b=2,c=3,d=4,e=5) 有5兩個引數 它們分別是: {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
當引數帶兩個星號(**)時,傳遞給函式的任意個key=value實參會被打包進一個字典中,那麼有打包就有解包,來看一個例子:
>>> a = {"one":1,"two":2,"three":3} >>> test(**a) 有3兩個引數 它們分別是: {'one': 1, 'two': 2, 'three': 3} >>>
*******************************
七、課時26課後習題及答案
*******************************