查字典的時候,通常我們會從某個字的特徵出發,如拼音或偏旁,最終根據索引,找到這個字。python中,也提供一種數據結構,它包含鍵和值兩個部分,通過鍵可以快速地找到對應的值。
python字典
字典通過大括號來聲明,可包含若干個鍵值對。字典是可變的。如下:
上面的demo也展示了可以通過鍵來訪問字典中的值,通過中括號加鍵名的方式。當試圖訪問字典中沒有的鍵時,會報鍵錯誤,KeyError。如下:
也可以添加一個字典中原來沒有的鍵,如下:
也可以通過del來刪除字典中的某個鍵值對,或刪除整個字典。但是不能刪除字典中沒有的鍵,會報KeyError。如下:
上面的demo中,當通過del語句刪除了dict1後,再嘗試輸出 dict1。會報NameError,名字錯誤。提示 dict1沒有定義。
python字典的鍵和值
對於字典來說,值可以是任意的python對象,可以是標準對象,也可以是自定義的對象。鍵則要求必須是一種不可變的對象。比如說數字,字符串,元組是可以作為鍵的,而列表,字典則是不行的。如下:
當嘗試以一種可變對象作為字典的鍵時,會報TypeError,類型錯誤。如下:
python字典的函數或方法
len函數可獲取字典中鍵的個數。(嵌套的不計)
str可以將字典以字符串的形式列印。
type可獲取變量的類型。如下:
clear方法可以清空字典中的所有鍵值對。如下:
copy可基於原字典,通過淺拷貝的方式,創建一個新的字典對象,如下:
python中,對象的拷貝存在深拷貝和淺拷貝的區別。這部分內容,後面會有專門的文章聊到。這裡,可以按照以下方式簡單理解:
1. 深拷貝下,對象中嵌套的每個對象都會重新複製一份,放在一個新的內存空間中。
2. 淺拷貝下,只會對對象中的第一層內容做複製,嵌套的內容不會重新複製,而是會繼續使用原來的對象。
基於以上兩條,再對照demo,嘗試理解:dict2是通過dict1.copy()得到的。之後,做了兩次修改:
1. 修改了dict1中鍵 a 對應的內容。
2. 修改了dict1中鍵 d 對應的值中的鍵 aa 對應的內容。
為什麼修改1的結果沒有影響到dict2,而修改2的結果影響到了dict2?
fromkeys接受兩個參數,參數1為一個序列,參數2是一個對象。該方法將形成一個字典,該字典以參數1序列的每個元素作為鍵,以參數2對象作為值。當參數2不傳時,值為None。如下:
get方法可以返回字典中某個鍵對應的值,這種方法,比直接通過中括號 + 鍵的訪問方式好的地方在於:
1. 當嘗試一個字典中不存在的鍵時,不會報錯,而是返回None。None是python中一個特殊的對象,表示空值,類型是NoneType。
2. 可通過第二個參數傳遞一個對象作為默認值,當字典中不存在該鍵時,返回默認值。如下:
通過 in 可判斷某個鍵是否在字典中。如下:
當需要對字典內容進行遍歷時,可以使用Items或keys或values方法。items會返回一個列表,列表中每個元素是一個元組,元組中包含兩個元素,元素0和元素1分別對應字典中的一個鍵值對。keys方法會返回一個只包含字典中鍵的列表。values方法會返回一個只包含字典中值的列表。如下:
setdefault方法可以在字典中添加一個鍵值對。它和直接通過小括號 + 鍵的方式區別如下:
1. 當要添加的鍵在字典中已經存在時,不報錯,但添加無效。
2. 可通過第二個參數傳遞一個默認值。不傳遞,則默認為None。
當需要刪除字典中某個鍵時,可使用pop或popitem。pop會刪除指定的鍵,並返回對應的值。popitem則會刪除字典中最後一組鍵值對,並返回一個鍵值對構成的元組。如下: