最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關(guān)于Python中字典dict的存儲原理詳解

 更新時(shí)間:2023年05月19日 11:47:45   作者:遇見糖糖  
Python字典是另一種可變?nèi)萜髂P?可存儲任意類型對象。如字符串、數(shù)字、元組等其他容器模型,因?yàn)樽值涫菬o序的所以不支持索引和切片,需要的朋友可以參考下

字典的定義

字典是"鍵值對"的無序可變序列,字典中的每個(gè)元素都是一個(gè)"鍵值對",包含:"鍵對象",和"值對象".可以通過"鍵對象"實(shí)現(xiàn)快速獲取,刪除,更新對應(yīng)的"值對象".

列表中我們通過"下標(biāo)數(shù)字"找到對應(yīng)的對象,字典中通過"鍵對象"找到對應(yīng)的"值對象"."鍵"是任意的不可變數(shù)據(jù),比如:整數(shù),浮點(diǎn)數(shù),字符串,元組.但是:列表,字典,集合這些可變的對象,不能作為"鍵".并且"鍵"不可重復(fù)."值"可以是任意的數(shù)據(jù),并且可重復(fù).

一個(gè)典型的字典的定義方式:

取字典的值

字典的創(chuàng)建:

1.可以使用{},dict()來創(chuàng)建字典對象

a = {}
b = dict(key1=value1,key2=value2)

注:這里面的key不需要帶"引起"直接就可以使用

c = dict([key1,key2],[value1,value2])

2.通過zip()創(chuàng)建字典對象

k = ["name","age","job"]
b = ["tangmoumou","18","student"]
d = dict(zip(k,b))

3.通過fromkeys創(chuàng)建鍵值為空的字典

a = dict.fromkeys('name','age','job'])

字典元素的訪問

為了測試各種訪穩(wěn)方法,先預(yù)設(shè)一個(gè)字典對象:

a = {"name":"唐","age":18,"job":"programmer"}
  • 通過鍵獲取值,若鍵不存在,則拋出異常
  • 通過get()方法獲得 "值",推薦使用

有的時(shí)候:返回具體的值,當(dāng)指定鍵不存在時(shí),返回None;也可以設(shè)置指定鍵不存在的時(shí)候默認(rèn)返回的對象.推薦使用get()獲取值對象

設(shè)置get的默認(rèn)返回值

  • 列出所有額鍵值對
a.items()

  • 列出所有鍵,列出所有的值
a.keys()
a.values()

  • len()鍵值對的個(gè)數(shù)
  • 檢測一個(gè) "鍵"是否在字典中

字典元素添加,修改和刪除

1.給字典新增 鍵值對,如果鍵已經(jīng)存在,則覆蓋 舊的建制地;如果 鍵不存在,則新增 鍵值對

2.使用update()將字典中所有鍵值對全部添加到舊字典對象上.如果key有重復(fù),則直接覆蓋

3.字典中元素的刪除,可以使用del()方法,或者clear()刪除所有的鍵值對;pop()刪除指定的鍵值對,并返回對應(yīng)的"值對象"

4.popitem():隨機(jī)刪除和返回該鍵值對.字典是"無序可變序列",因此沒有第一個(gè)元素,最后一個(gè)元素的概念:popitem彈出隨機(jī)的項(xiàng),因此字典并沒有"最后的元素"或者其他有關(guān)熟悉怒的概念,若想一個(gè)接一個(gè)移除并處理項(xiàng),這個(gè)方法就非常有效(因?yàn)椴挥檬紫全@取鍵的列表)

序列解包

序列解包可用于元組,列表,字典.序列解包可以讓我們方便的對多個(gè)變量賦值.

序列解包用于字典時(shí),默認(rèn)是對"鍵"進(jìn)行操作;如果需要對鍵值對操作,則需要使用items();如果需要對"值"進(jìn)行操作,則需要使用values();

s = {"name":"唐某某","age":18,"job":"student"}

字典核心底層原理(重要)

字典對象的核心是散列表.散列表是一個(gè)稀疏數(shù)組(總是有空白元素的數(shù)組),數(shù)組的每個(gè)單元叫做bucket,每個(gè)bucket有兩部分:一個(gè)是鍵對象的引用,一個(gè)是值對象的引用.

由于,所有bucket結(jié)構(gòu)和大小一致,我么可以通過偏移量來指定bucket.

將一個(gè)鍵值對放進(jìn)字典的底層過程

a={}
a["name"] = "tang"

當(dāng)將"name"="tang"這個(gè)鍵值對放到字典對象a中,首先第一步要計(jì)算鍵"name"的散列表.Python可以使用hash()來計(jì)算.

由于數(shù)組長度為8,我們可以拿計(jì)算出的散列值,最右邊3位數(shù)作為偏移量,即"010",十進(jìn)制是數(shù)字2,我們查看偏移量2,對應(yīng)的bucket是否為空,如果為空,則將鍵值放進(jìn)去,如果不為空,依次取右邊3位作為偏移量'101',十進(jìn)制是數(shù)字5,再查看偏移量5的bucket是否為空.直到棧為空的bucket將鍵值放進(jìn)去

根據(jù)鍵查找"鍵值對"的底層過程

一個(gè)鍵值對是如果存儲到數(shù)組中的,根據(jù)鍵值對象取到值對象,理解起來就簡單了

a.get("name")

當(dāng)我們調(diào)用a.get("name"),就是根據(jù)鍵"name"查找"鍵值對",從而找到值"tang"

第一步,我們?nèi)砸?jì)算"name"對象的散列值:

bin(hash("name"))

和存儲的底層流程算法一致,也是一次取散列值不同的數(shù)字,假設(shè)數(shù)組長度為8,我們可以拿計(jì)算出的散列值的最右邊3位數(shù)字作為偏移量,即"010",十進(jìn)制是數(shù)字2,我們查看偏移量5,對應(yīng)的bucket是否為空.如果為空則返回None.如果不為空,則將這個(gè)bucket對象的鍵對象計(jì)算對應(yīng)的散列值,和我們的散列值進(jìn)行比較,如果相等,則將對應(yīng)"值對象"返回,如果不相等,則一次取其它幾位數(shù)字,重新計(jì)算偏移量,依次取完后仍沒有找到哦啊,則返回None.

用法總結(jié):

  • 1.鍵必須可散列
    • 數(shù)字,字符串,元組,都是可散列的
    • 自定義對象需要支持下面三點(diǎn);
    • 支持hash()函數(shù)
    • 支持通過__eq__()方法尖刺相等性
    • 做a==b為真,則hash(a)==hash(b)也為真.
  • 2.字典在內(nèi)存中開銷巨大,典型的空間換時(shí)間.
  • 3.鍵值查詢速度很快
  • 4.往字典烈面添加新鍵可能導(dǎo)致擴(kuò)容,導(dǎo)致散列表中的鍵的次序發(fā)生變化.因此,不要在遍歷字典的同時(shí)對字典的修改.

到此這篇關(guān)于關(guān)于Python中字典dict的存儲原理詳解的文章就介紹到這了,更多相關(guān)Python字典存儲原理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python創(chuàng)建生成器以及訪問的方法詳解

    python創(chuàng)建生成器以及訪問的方法詳解

    這篇文章主要介紹了python創(chuàng)建生成器以及訪問的方法詳解,與列表一次性地將數(shù)據(jù)全都加載到內(nèi)存不同的是,生成器使用推斷加載數(shù)據(jù),每次只推斷出一個(gè)對象,在數(shù)據(jù)量比較大時(shí),可以節(jié)省內(nèi)存,需要的朋友可以參考下
    2023-11-11
  • python實(shí)現(xiàn)的批量分析xml標(biāo)簽中各個(gè)類別個(gè)數(shù)功能示例

    python實(shí)現(xiàn)的批量分析xml標(biāo)簽中各個(gè)類別個(gè)數(shù)功能示例

    這篇文章主要介紹了python實(shí)現(xiàn)的批量分析xml標(biāo)簽中各個(gè)類別個(gè)數(shù)功能,涉及Python針對xml文件的遍歷、讀取、解析等相關(guān)操作技巧,需要的朋友可以參考下
    2019-12-12
  • 詳談Python中列表list,元祖tuple和numpy中的array區(qū)別

    詳談Python中列表list,元祖tuple和numpy中的array區(qū)別

    下面小編就為大家分享一篇詳談Python中列表list,元祖tuple和numpy中的array區(qū)別,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • Pytorch實(shí)現(xiàn)圖片異常檢測功能

    Pytorch實(shí)現(xiàn)圖片異常檢測功能

    異常檢測指的是在正常的圖片中找到異常的數(shù)據(jù),由于無法通過規(guī)則進(jìn)行識別判斷,這樣的應(yīng)用場景通常都是需要人工進(jìn)行識別,本文給大家介紹了使用Pytorch實(shí)現(xiàn)圖片異常檢測功能,感興趣的朋友可以參考下
    2024-05-05
  • 對Tensorflow中Device實(shí)例的生成和管理詳解

    對Tensorflow中Device實(shí)例的生成和管理詳解

    今天小編就為大家分享一篇對Tensorflow中Device實(shí)例的生成和管理詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • Python設(shè)計(jì)密碼強(qiáng)度校驗(yàn)程序

    Python設(shè)計(jì)密碼強(qiáng)度校驗(yàn)程序

    這篇文章主要介紹了Python如何設(shè)計(jì)密碼強(qiáng)度校驗(yàn)程序,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • Python實(shí)現(xiàn)購物程序思路及代碼

    Python實(shí)現(xiàn)購物程序思路及代碼

    本文給大家分享的是使用Python實(shí)現(xiàn)的購物小程序的思路要求以及相關(guān)代碼,非常的簡單實(shí)用,有需要的小伙伴可以參考下
    2017-07-07
  • Python中的生成器和yield詳細(xì)介紹

    Python中的生成器和yield詳細(xì)介紹

    這篇文章主要介紹了Python中的生成器和yield詳細(xì)介紹,本文講解了列表推導(dǎo)與生成器表達(dá)式、斐波那契數(shù)列、生成器Generator、協(xié)程與yield表達(dá)式、使用生成器與協(xié)程等內(nèi)容,需要的朋友可以參考下
    2015-01-01
  • python中isinstance()和insubclass()的實(shí)現(xiàn)

    python中isinstance()和insubclass()的實(shí)現(xiàn)

    本文主要介紹了python中isinstance()和insubclass()的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-09-09
  • python 統(tǒng)計(jì)一個(gè)列表當(dāng)中的每一個(gè)元素出現(xiàn)了多少次的方法

    python 統(tǒng)計(jì)一個(gè)列表當(dāng)中的每一個(gè)元素出現(xiàn)了多少次的方法

    今天小編就為大家分享一篇python 統(tǒng)計(jì)一個(gè)列表當(dāng)中的每一個(gè)元素出現(xiàn)了多少次的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-11-11

最新評論

农安县| 临澧县| 日喀则市| 巨野县| 察雅县| 应用必备| 凉城县| 绥中县| 鄂尔多斯市| 稷山县| 左权县| 旬邑县| 科技| 延长县| 吉隆县| 溆浦县| 同江市| 阿图什市| 察雅县| 九江县| 黎城县| 红河县| 武汉市| 梅河口市| 辉南县| 玉溪市| 晋江市| 延庆县| 双流县| 漠河县| 临沧市| 泗阳县| 大渡口区| 金湖县| 双柏县| 长丰县| 美姑县| 北京市| 青州市| 张掖市| 余干县|