Python基礎(chǔ)手冊(cè)13——映射(字典)

映射

映射表示由任意索引集索引的有限的,無序的,鍵不重復(fù)的對(duì)象集合。目前有一種映射類型:字典。

一、字典

一個(gè)字典對(duì)象是可變的,它是一個(gè)容器類型,可以通過 {key1:value1, key2:value2,...} 方法創(chuàng)建。字典能存儲(chǔ)任意個(gè)數(shù)的 Python 對(duì)象,也包括其他的容器類型。字典的索引操作使用的是和序列相同的語法,但是在方括號(hào)中的元素是鍵,而不是相對(duì)位置,作為映射,字典僅支持通過鍵獲取元素。每個(gè)鍵只能對(duì)應(yīng)一個(gè)值,一鍵對(duì)應(yīng)多個(gè)值是不允許的。對(duì)一個(gè)新的字典的鍵賦值會(huì)創(chuàng)建該鍵。

幾乎所有類型的 Python 不可變對(duì)象都可以用作鍵(字典的鍵需要密鑰的哈希值保持不變),不過一般還是以數(shù)字或者字符串最為常用。值可以是任意類型的 Python 對(duì)象。

字典類型和序列類型(列表、元組)的區(qū)別是存儲(chǔ)和訪問數(shù)據(jù)的方式不同。序列類型只用數(shù)字類型的鍵(從序列的開始起按數(shù)值順序索引)。字典類型可以用其他對(duì)象類型做鍵,一般最常見的是用字符串做鍵(keys)。和序列類型的鍵不同,映射類型的鍵(keys)直接或間接地和存儲(chǔ)的數(shù)據(jù)值相關(guān)聯(lián),而且映射類型中的數(shù)據(jù)是無序排列的。

除了列表以外,字典也許是Python之中最靈活的內(nèi)置數(shù)據(jù)結(jié)構(gòu)類型,如果把列表看做是有序的對(duì)象集合,那么就可以把字典當(dāng)成是無序的集合。它們主要的差別在于:字典當(dāng)中的元素是通過鍵來存取的,而不是通過偏移存取。對(duì)字典進(jìn)行索引是非??焖俚乃阉鞑僮鳎琍ython采用最優(yōu)化的散列算法來尋找鍵,因此使用鍵查找的速度非???。字典存儲(chǔ)的是對(duì)象的引用(不是拷貝)。

哈希表與字典的關(guān)系

序列類型用有序的數(shù)字鍵做索引將數(shù)據(jù)以數(shù)組的形式存儲(chǔ)。 一般,索引值與所存儲(chǔ)的數(shù)據(jù)毫無關(guān)系。還可以用另一種方式來存儲(chǔ)數(shù)據(jù):基于某種相關(guān)值, 比如說一個(gè)字符串。

我們?cè)谌粘I钪幸恢边@么做。你把人們的電話號(hào)碼按照他們的姓記錄在電話簿上,你按照時(shí)間在日歷或約會(huì)簿上添加事件,等等。在這些例子中,你的鍵(key)就是和數(shù)據(jù)項(xiàng)相關(guān)的值。哈希表是一種數(shù)據(jù)結(jié)構(gòu),哈希表中存儲(chǔ)的每一條數(shù)據(jù),叫做一個(gè)值(value),是根據(jù)與它相關(guān)的一個(gè)被稱作為鍵(key)的數(shù)據(jù)項(xiàng)進(jìn)行存儲(chǔ)的。鍵和值合在一起被稱為“鍵-值 對(duì)”(key-value pairs)。 哈希表的算法是獲取鍵,對(duì)鍵執(zhí)行一個(gè)叫做哈希函數(shù)的操作,并根據(jù)計(jì)算的結(jié)果,選擇在數(shù)據(jù)結(jié)構(gòu)的某個(gè)地址中來存儲(chǔ)你的值。任何一個(gè)值存儲(chǔ)的地址皆取決于它的鍵。正因?yàn)檫@種隨意性,哈希表中的值是沒有順序的。你擁有的是一個(gè)無序的數(shù)據(jù)集。哈希表一般有很好的性能,用鍵查詢相當(dāng)快。

你所能獲得的有序集合只能是字典中的鍵的集合或者值的集合。方法 Keys() 或 values() 返回一個(gè)列表,該列表是可排序的。 你還可以用 items()方法得到包含鍵、值對(duì)的列表來排序。


二、字典的基本操作

1、創(chuàng)建字典

一個(gè)字典條目的語法格式是 鍵:值 。 而且,多條字典條目被包含在 { } 里。創(chuàng)建字典只需要把字典賦值給一個(gè)變量,不管這個(gè)字典是否包含元素。

可以用工廠方法 dict() 來創(chuàng)建字典。

從 Python 2.3 版本起,可以用一個(gè)很方便的內(nèi)建方法 fromkeys() 來創(chuàng)建一個(gè)"默認(rèn)"字典,字典中元素具有相同的值 (如果沒有給出, 默認(rèn)為 None)。


2、訪問字典中的值

下標(biāo)表示法 a[k] 從映射對(duì)象 a 中選擇由 k 鍵索引的元素,它可以用在表達(dá)式中用于賦值或作為 del() 語句的目標(biāo)。內(nèi)建函數(shù) len() 返回映射中元素的個(gè)數(shù)。

從 Python 2.2 開始,你可以不必再用 keys() 方法獲取供循環(huán)使用的鍵值列表了??梢杂玫鱽磔p松地訪問類序列對(duì)象(sequence-like objects),比如字典和文件。只需要用字典的名字就可以在 for 循環(huán)里遍歷字典。

要想遍歷一個(gè)字典(一般用鍵), 你只需要循環(huán)查看它的鍵。


3、更新字典

你可以通過以下幾種方式對(duì)一個(gè)字典做修改:添加一個(gè)新數(shù)據(jù)項(xiàng)或新元素(即,一個(gè)鍵-值對(duì));修改一個(gè)已存在的數(shù)據(jù)項(xiàng);或刪除一個(gè)已存在的數(shù)據(jù)項(xiàng)。

刪除整個(gè)字典的操作不常見。通常,你刪除字典中的單個(gè)元素或是清除整個(gè)字典的內(nèi)容。但是,如果你真想"刪除"一個(gè)字典,用 del() 語句。使用 clear() 方法清除整個(gè)字典的內(nèi)容。使用 pop() 方法刪除指定的元素并返回其值。




三、字典類型操作符

字典可以和所有的標(biāo)準(zhǔn)類型操作符一起工作,但卻不支持像拼接(concatenation)和重復(fù)(repetition)這樣的操作。這些操作對(duì)序列有意義,可對(duì)映射類型行不通。

1、字典的鍵查找操作符([ ])

鍵查找操作符是唯一僅用于字典類型的操作符,它和序列類型里單一元素的切片(slice)操作符很相象。對(duì)序列類型來說,用索引做唯一參數(shù)或下標(biāo)(subscript)以獲取一個(gè)序列中某個(gè)元素的值。對(duì)字典類型來說,是用鍵(key)查詢(字典中的元素),所以鍵是參數(shù)(argument),而不是一個(gè)索引(index)。鍵查找操作符既可以用于給字典賦值,也可以用于從字典中取值。

d[k] = v   通過鍵'k',給字典中某元素賦值'v'
d[k]       通過鍵'k',查詢字典中某元素的值


2、(鍵)成員關(guān)系操作( in,not in)

使用 innot inh 操作符來檢查某個(gè)鍵是否存在于字典中。




三、字典可用的內(nèi)建函數(shù)

1、dict()

工廠函數(shù) dict() 被用來創(chuàng)建字典。如果不提供參數(shù),會(huì)生成空字典。當(dāng)容器類型對(duì)象做為一個(gè)參數(shù)傳遞給方法 dict() 時(shí),如果參數(shù)是可以迭代的,即,一個(gè)序列,或是一個(gè)迭代器,或是一個(gè)支持迭代的對(duì)象,那每個(gè)可迭代的元素必須成對(duì)出現(xiàn)。在每個(gè)值對(duì)中,第一個(gè)元素是字典的鍵、第二個(gè)元素是字典中的值。

如果輸入?yún)?shù)是(另)一個(gè)映射對(duì)象,比如,一個(gè)字典對(duì)象,對(duì)其調(diào)用 dict() 會(huì)從存在的字典里復(fù)制內(nèi)容來生成新的字典。新生成的字典是原來字典對(duì)象的淺復(fù)制版本, 它與用字典的內(nèi)建方法 copy() 生成的字典對(duì)象是一樣的。但是從已存在的字典生成新的字典速度比用 copy() 方法慢,我們推薦使用 copy()。


2、len()

內(nèi)建函數(shù) len() 很靈活。它可用在序列、映射類型和集合上(在本章的后面我們會(huì)看到)。對(duì)字典調(diào)用 len(),它會(huì)返回所有元素(鍵-值對(duì))的數(shù)目。


3、hash()

內(nèi)建函數(shù) hash() 本身并不是為字典設(shè)計(jì)的方法, 但它可以判斷某個(gè)對(duì)象是否可以做一個(gè)字典的鍵。將一個(gè)對(duì)象作為參數(shù)傳遞給 hash(),會(huì)返回這個(gè)對(duì)象的哈希值。 只有這個(gè)對(duì)象是可哈希的,才可作為字典的鍵 (函數(shù)的返回值是整數(shù),不產(chǎn)生錯(cuò)誤或異常)。

如果用比較操作符來比較兩個(gè)數(shù)值,發(fā)現(xiàn)它們是相等的,那么即使二者的數(shù)據(jù)類型不同, 它們也會(huì)得到相同的哈希值。

如果非可哈希類型作為參數(shù)傳遞給 hash() 方法,會(huì)產(chǎn)生 TypeError 錯(cuò)誤(因此,如果使用這樣的對(duì)象作為鍵給字典賦值時(shí)會(huì)出錯(cuò))。




四、字典類型內(nèi)建方法

1、update() 使用指定的字典更新字典


2、keys() values() 返回字典的鍵、值


3、get() 找到指定的鍵的值


4、pop() 刪除指定的鍵對(duì)應(yīng)的元素


5、setdefault() 在字典中取指定鍵的值,如果不存在就按我們指定的鍵和默認(rèn)的值插入到字典中


6、clear() 清空字典


《Python基礎(chǔ)手冊(cè)》系列:

Python基礎(chǔ)手冊(cè) 1 —— Python語言介紹
Python基礎(chǔ)手冊(cè) 2 —— Python 環(huán)境搭建(Linux)
Python基礎(chǔ)手冊(cè) 3 —— Python解釋器
Python基礎(chǔ)手冊(cè) 4 —— 文本結(jié)構(gòu)
Python基礎(chǔ)手冊(cè) 5 —— 標(biāo)識(shí)符和關(guān)鍵字
Python基礎(chǔ)手冊(cè) 6 —— 操作符
Python基礎(chǔ)手冊(cè) 7 —— 內(nèi)建函數(shù)
Python基礎(chǔ)手冊(cè) 8 —— Python對(duì)象
Python基礎(chǔ)手冊(cè) 9 —— 數(shù)字類型
Python基礎(chǔ)手冊(cè)10 —— 序列(字符串)
Python基礎(chǔ)手冊(cè)11 —— 序列(元組&列表)
Python基礎(chǔ)手冊(cè)12 —— 序列(類型操作)
Python基礎(chǔ)手冊(cè)13 —— 映射(字典)
Python基礎(chǔ)手冊(cè)14 —— 集合
Python基礎(chǔ)手冊(cè)15 —— 解析
Python基礎(chǔ)手冊(cè)16 —— 文件
Python基礎(chǔ)手冊(cè)17 —— 簡單語句
Python基礎(chǔ)手冊(cè)18 —— 復(fù)合語句(流程控制語句)
Python基礎(chǔ)手冊(cè)19 —— 迭代器
Python基礎(chǔ)手冊(cè)20 —— 生成器
Python基礎(chǔ)手冊(cè)21 —— 函數(shù)的定義
Python基礎(chǔ)手冊(cè)22 —— 函數(shù)的參數(shù)
Python基礎(chǔ)手冊(cè)23 —— 函數(shù)的調(diào)用
Python基礎(chǔ)手冊(cè)24 —— 函數(shù)中變量的作用域
Python基礎(chǔ)手冊(cè)25 —— 裝飾器
Python基礎(chǔ)手冊(cè)26 —— 錯(cuò)誤 & 異常
Python基礎(chǔ)手冊(cè)27 —— 模塊
Python基礎(chǔ)手冊(cè)28 —— 模塊的高級(jí)概念
Python基礎(chǔ)手冊(cè)29 —— 包

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容