和列表相同,字典也是許多數據的集合,屬於可變序列類型。不一樣之處在於,它是無序的可變序列,其保存的內容是以「鍵值對」的形式存放的。
字典類型是 Python 中惟一的映射類型。「映射」是數學中的術語,簡單理解,它指的是元素之間相互對應的關係,即經過一個元素,能夠惟一找到另外一個元素。如圖 1 所示。java
字典中,習慣將各元素對應的索引稱爲鍵(key,K值),各個鍵對應的元素稱爲值(value,V值),鍵及其關聯的值稱爲「鍵值對」。
字典類型很像學生時代經常使用的新華字典。咱們知道,經過新華字典中的音節表,能夠快速找到想要查找的漢字。其中,字典裏的音節表就至關於字典類型中的鍵,而鍵對應的漢字則至關於值。
總的來講,字典類型所具備的主要特徵如表 1 所示。
python
表 1 Python 字典特徵shell
主要特徵 | 解釋 |
---|---|
經過鍵而不是經過索引來讀取元素 | 字典類型有時也稱爲關聯數組或者散列表(hash)。它是經過鍵將一系列的值聯繫起來的,這樣就能夠經過鍵從字典中獲取指定項,但不能經過索引來獲取。 |
字典是任意數據類型的無序集合 | 和列表、元組不一樣,一般會將索引值 0 對應的元素稱爲第一個元素。而字典中的元素是無序的。 |
字典是可變的,而且能夠任意嵌套 | 字典能夠在原處增加或者縮短(無需生成一個副本,在原數據上進行操做),而且它支持任意深度的嵌套,即字典存儲的V值也能夠是列表或其它的字典。 |
字典中的鍵必須惟一 | 字典中,不支持同一個鍵出現屢次,不然,只會保留最後一個鍵值對。 |
字典中的鍵必須不可變 | 字典中的K值是不可變的,只能使用數字、字符串或者元組,不能使用列表(K值必須是可哈希的)。 |
Python 中的字典類型至關於 Java 或者 C++ 中的 Map 對象。數組
和列表、元組同樣,字典也有它本身的類型。Python 中,字典的數據類型爲 dict,經過 type() 函數便可查看:函數
# a是一個字典類型 >>> a = {'one':1,'two':2,'three':3} >>> type(a) <class 'dict'>
建立字典的方式有不少,下面一一作介紹。spa
因爲字典中每一個元素都包含 2 部分,分別是鍵和值,所以在建立字典時,鍵和值之間使用冒號分隔,相鄰元素之間使用逗號分隔,全部元素放在大括號 {} 中。
Python 字典類型的語法格式以下:.net
dictname = {'key':'value1', 'key2':'value2', ..., 'keyn':valuen}
其中 dictname 表示字典類型名,keyN: valueN 表示各個元素的鍵值對。須要注意的是,同一字典中各個元素的鍵值必須惟一。
以下代碼示範了使用花括號語法建立字典:code
scores = {'語文': 89, '數學': 92, '英語': 93} print(scores) # 空的花括號表明空的dict empty_dict = {} print(empty_dict) # 使用元組做爲dict的key dict2 = {(20, 30):'good', 30:[1,2,3]} print(dict2)
運行結果爲:對象
{'語文': 89, '數學': 92, '英語': 93} {} {(20, 30): 'good', 30: [1, 2, 3]}
能夠看到,同一字典中,K值能夠是整數、字符串或者元組,只要符合惟一和不可變的特性;對應的V值能夠是 Python 支持的任意數據類型。blog
Python 中,還可使用 dict 字典類型提供的 fromkeys() 方法建立全部鍵值爲空的字典,使用此方法的語法格式爲:
dictname = dict.fromkeys(list,value=None)
其中,list 參數表示字典中全部K值的列表,value 參數默認爲 None,表示全部鍵對應的值。
例如:
# 列表knowledge = ['語文', '數學', '英語']效果相同 knowledge = {'語文', '數學', '英語'} scores = dict.fromkeys(knowledge) print(scores)
運行結果爲:
{'語文': None, '數學': None, '英語': None}
能夠看到,knowledge 列表中的元素所有做爲了 scores 字典的鍵,而各個K值對應的V值都爲空(None)。此種建立方式,一般用於初始化字典,設置 value 的默認值。
經過 dict() 函數建立字典的寫法有多種,表 2 羅列出了經常使用的幾種方式,它們建立的都是同一個字典 a。
表 2 dict() 函數建立字典
建立格式 | 注意事項 |
---|---|
a = dict(one = 1, two = 2, three = 3) | 注意,其中的 one、two、three 都是字符串,但使用此方式建立字典時,字符串不能帶引號。 |
demo = [('two',2),('one',1),('three',3)] #方式1 demo = [['two',2],['one',1],['three',3]] #方式2 demo = (('two',2),('one',1),('three',3)) #方式3 demo = (['two',2],['one',1],['three',3]) #方式4 a = dict(demo) |
向 dict() 函數傳入列表或元組,而它們中的元素又各自是包含 2 個元素的列表或元組,其中第一個元素做爲鍵,第二個元素做爲值。 |
demokeys = ['one','two','three'] #還能夠是字符串或元組 demovalues = [1,2,3] #還能夠是字符串或元組 a = dict(zip(demokeys,demovalues)) |
經過應用 dict() 函數和 zip() 函數,可將前兩個列表轉換爲對應的字典。 |
注意,不管採用以上哪一種方式建立字典,字典中各元素的鍵都只能是字符串、元組或數字,不能是列表。
若是不爲 dict() 函數傳入任何參數,則表明建立一個空的字典。例如以下代碼:
# 建立空的字典 dict5 = dict() print(dict5)
運行結果爲:
{}
列表、元組訪問元素都是經過下標,字典是經過鍵(K值)來訪問對應的元素值(V值)。
由於字典中元素是無序的,因此不能像列表、元組那樣,採用切片的方式一次性訪問多個元素。
例如,若是想訪問剛剛創建的字典 a 中,獲取元素 1,可使用下面的代碼:
>>> a['one'] 1
在使用此方法獲取指定鍵的值時,若是鍵不存在,則會拋出以下異常:
>>> a['four'] Traceback (most recent call last): File "<pyshell#2>", line 1, in <module> a['four'] KeyError: 'four'
另外,除了上面這種方式外,Python 更推薦使用 dict 類型提供的 get() 方法獲取指定鍵的值。get() 方法的語法格式爲:
dict.get(key[,default])
其中,dict 指的是所建立的字典名稱;key 表示指定的鍵;default 用於指定要查詢的鍵不存在時,此方法返回的默認值,若是不手動指定,會返回 None。
例如,經過 get() 方法獲取字典 a 中「two」對應的值,執行代碼以下:
>>> a = dict(one=1,two=2,three=3) >>>a.get('two') 2
固然,爲了防止在獲取指定鍵的值時,因不存在該鍵而致使拋出異常,在使用 get() 方法時,能夠爲其設置默認值,這樣,即使指定的鍵不存在,也不回報錯。例如:
>>> a = dict(one=1,two=2,three=3) >>> a.get('four','字典中無此鍵') '字典中無此鍵'
和刪除列表、元組同樣,手動刪除字典也可使用 del 語句。例如:
>>> a = dict(one=1,two=2,three=3) >>> a {'one': 1, 'two': 2, 'three': 3} >>> del(a) >>> a Traceback (most recent call last): File "<pyshell#16>", line 1, in <module> a NameError: name 'a' is not defined