課時26:字典:各種內建方法

那是個好男孩發表於2018-08-16

目錄:

  一、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課後習題及答案

*******************************

相關文章