關(guān)于Python中字典dict的存儲(chǔ)原理詳解
字典的定義
字典是"鍵值對(duì)"的無(wú)序可變序列,字典中的每個(gè)元素都是一個(gè)"鍵值對(duì)",包含:"鍵對(duì)象",和"值對(duì)象".可以通過(guò)"鍵對(duì)象"實(shí)現(xiàn)快速獲取,刪除,更新對(duì)應(yīng)的"值對(duì)象".
列表中我們通過(guò)"下標(biāo)數(shù)字"找到對(duì)應(yīng)的對(duì)象,字典中通過(guò)"鍵對(duì)象"找到對(duì)應(yīng)的"值對(duì)象"."鍵"是任意的不可變數(shù)據(jù),比如:整數(shù),浮點(diǎn)數(shù),字符串,元組.但是:列表,字典,集合這些可變的對(duì)象,不能作為"鍵".并且"鍵"不可重復(fù)."值"可以是任意的數(shù)據(jù),并且可重復(fù).
一個(gè)典型的字典的定義方式:
取字典的值
字典的創(chuàng)建:
1.可以使用{},dict()來(lái)創(chuàng)建字典對(duì)象
a = {} b = dict(key1=value1,key2=value2)
注:這里面的key不需要帶"引起"直接就可以使用
c = dict([key1,key2],[value1,value2])
2.通過(guò)zip()創(chuàng)建字典對(duì)象
k = ["name","age","job"] b = ["tangmoumou","18","student"] d = dict(zip(k,b))
3.通過(guò)fromkeys創(chuàng)建鍵值為空的字典
a = dict.fromkeys('name','age','job'])
字典元素的訪問(wèn)
為了測(cè)試各種訪穩(wěn)方法,先預(yù)設(shè)一個(gè)字典對(duì)象:
a = {"name":"唐","age":18,"job":"programmer"}
- 通過(guò)鍵獲取值,若鍵不存在,則拋出異常
- 通過(guò)get()方法獲得 "值",推薦使用
有的時(shí)候:返回具體的值,當(dāng)指定鍵不存在時(shí),返回None;也可以設(shè)置指定鍵不存在的時(shí)候默認(rèn)返回的對(duì)象.推薦使用get()獲取值對(duì)象
設(shè)置get的默認(rèn)返回值
- 列出所有額鍵值對(duì)
a.items()
- 列出所有鍵,列出所有的值
a.keys() a.values()
- len()鍵值對(duì)的個(gè)數(shù)
- 檢測(cè)一個(gè) "鍵"是否在字典中
字典元素添加,修改和刪除
1.給字典新增 鍵值對(duì),如果鍵已經(jīng)存在,則覆蓋 舊的建制地;如果 鍵不存在,則新增 鍵值對(duì)
2.使用update()將字典中所有鍵值對(duì)全部添加到舊字典對(duì)象上.如果key有重復(fù),則直接覆蓋
3.字典中元素的刪除,可以使用del()方法,或者clear()刪除所有的鍵值對(duì);pop()刪除指定的鍵值對(duì),并返回對(duì)應(yīng)的"值對(duì)象"
4.popitem():隨機(jī)刪除和返回該鍵值對(duì).字典是"無(wú)序可變序列",因此沒(méi)有第一個(gè)元素,最后一個(gè)元素的概念:popitem彈出隨機(jī)的項(xiàng),因此字典并沒(méi)有"最后的元素"或者其他有關(guān)熟悉怒的概念,若想一個(gè)接一個(gè)移除并處理項(xiàng),這個(gè)方法就非常有效(因?yàn)椴挥檬紫全@取鍵的列表)
序列解包
序列解包可用于元組,列表,字典.序列解包可以讓我們方便的對(duì)多個(gè)變量賦值.
序列解包用于字典時(shí),默認(rèn)是對(duì)"鍵"進(jìn)行操作;如果需要對(duì)鍵值對(duì)操作,則需要使用items();如果需要對(duì)"值"進(jìn)行操作,則需要使用values();
s = {"name":"唐某某","age":18,"job":"student"}
字典核心底層原理(重要)
字典對(duì)象的核心是散列表.散列表是一個(gè)稀疏數(shù)組(總是有空白元素的數(shù)組),數(shù)組的每個(gè)單元叫做bucket,每個(gè)bucket有兩部分:一個(gè)是鍵對(duì)象的引用,一個(gè)是值對(duì)象的引用.
由于,所有bucket結(jié)構(gòu)和大小一致,我么可以通過(guò)偏移量來(lái)指定bucket.
將一個(gè)鍵值對(duì)放進(jìn)字典的底層過(guò)程
a={} a["name"] = "tang"
當(dāng)將"name"="tang"這個(gè)鍵值對(duì)放到字典對(duì)象a中,首先第一步要計(jì)算鍵"name"的散列表.Python可以使用hash()來(lái)計(jì)算.
由于數(shù)組長(zhǎng)度為8,我們可以拿計(jì)算出的散列值,最右邊3位數(shù)作為偏移量,即"010",十進(jìn)制是數(shù)字2,我們查看偏移量2,對(duì)應(yīng)的bucket是否為空,如果為空,則將鍵值放進(jìn)去,如果不為空,依次取右邊3位作為偏移量'101',十進(jìn)制是數(shù)字5,再查看偏移量5的bucket是否為空.直到棧為空的bucket將鍵值放進(jìn)去
根據(jù)鍵查找"鍵值對(duì)"的底層過(guò)程
一個(gè)鍵值對(duì)是如果存儲(chǔ)到數(shù)組中的,根據(jù)鍵值對(duì)象取到值對(duì)象,理解起來(lái)就簡(jiǎn)單了
a.get("name")
當(dāng)我們調(diào)用a.get("name"),就是根據(jù)鍵"name"查找"鍵值對(duì)",從而找到值"tang"
第一步,我們?nèi)砸?jì)算"name"對(duì)象的散列值:
bin(hash("name"))
和存儲(chǔ)的底層流程算法一致,也是一次取散列值不同的數(shù)字,假設(shè)數(shù)組長(zhǎng)度為8,我們可以拿計(jì)算出的散列值的最右邊3位數(shù)字作為偏移量,即"010",十進(jìn)制是數(shù)字2,我們查看偏移量5,對(duì)應(yīng)的bucket是否為空.如果為空則返回None.如果不為空,則將這個(gè)bucket對(duì)象的鍵對(duì)象計(jì)算對(duì)應(yīng)的散列值,和我們的散列值進(jìn)行比較,如果相等,則將對(duì)應(yīng)"值對(duì)象"返回,如果不相等,則一次取其它幾位數(shù)字,重新計(jì)算偏移量,依次取完后仍沒(méi)有找到哦啊,則返回None.
用法總結(jié):
- 1.鍵必須可散列
- 數(shù)字,字符串,元組,都是可散列的
- 自定義對(duì)象需要支持下面三點(diǎn);
- 支持hash()函數(shù)
- 支持通過(guò)__eq__()方法尖刺相等性
- 做a==b為真,則hash(a)==hash(b)也為真.
- 2.字典在內(nèi)存中開(kāi)銷巨大,典型的空間換時(shí)間.
- 3.鍵值查詢速度很快
- 4.往字典烈面添加新鍵可能導(dǎo)致擴(kuò)容,導(dǎo)致散列表中的鍵的次序發(fā)生變化.因此,不要在遍歷字典的同時(shí)對(duì)字典的修改.
到此這篇關(guān)于關(guān)于Python中字典dict的存儲(chǔ)原理詳解的文章就介紹到這了,更多相關(guān)Python字典存儲(chǔ)原理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Django自定義分頁(yè)與bootstrap分頁(yè)結(jié)合
這篇文章主要為大家詳細(xì)介紹了Django自定義分頁(yè)與bootstrap分頁(yè)結(jié)合使用的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05python subprocess 殺掉全部派生的子進(jìn)程方法
下面小編就為大家?guī)?lái)一篇python subprocess 殺掉全部派生的子進(jìn)程方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01TensorFlow在MAC環(huán)境下的安裝及環(huán)境搭建
小編在論壇中看到很多朋友在尋找TensorFlow的環(huán)境搭建圖文步驟以及安裝的具體流程,在此小編給大家整理了一篇非常詳細(xì)的圖文流程,希望能夠幫助到你。2017-11-11pytorch如何對(duì)image和label同時(shí)進(jìn)行隨機(jī)翻轉(zhuǎn)
這篇文章主要介紹了pytorch如何對(duì)image和label同時(shí)進(jìn)行隨機(jī)翻轉(zhuǎn)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09django的csrf實(shí)現(xiàn)過(guò)程詳解
這篇文章主要介紹了django的csrf實(shí)現(xiàn)過(guò)程相加,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07