日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python字典定义方式_Python字典常用方法及汇总

發(fā)布時(shí)間:2023/12/19 python 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python字典定义方式_Python字典常用方法及汇总 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

字典的概念

字典是“鍵值對(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è)典型的字典的定義方式:

a = {'name':'gaoqi','age':18,'job':'programmer'}

字典的創(chuàng)建

通過(guò){}、dict()來(lái)創(chuàng)建字典對(duì)象。

>>> a = {'name':'gaoqi','age':18,'job':'programmer'}

>>> b = dict(name='gaoqi',age=18,job='programmer')

>>> a = dict([("name","gaoqi"),("age",18)])

>>> c = {} #空的字典對(duì)象

>>> d = dict() #空的字典對(duì)象

通過(guò) zip()創(chuàng)建字典對(duì)象

>>> k = ['name','age','job']

>>> v = ['gaoqi',18,'techer']

>>> d = dict(zip(k,v))

>>> d

{'name': 'gaoqi', 'age': 18, 'job': 'techer'}

通過(guò) fromkeys 創(chuàng)建值為空的字典

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

>>> a

{'name': None, 'age': None, 'job': None}

字典元素的訪問(wèn)

為了測(cè)試各種訪問(wèn)方法,我們這里設(shè)定一個(gè)字典對(duì)象:

a = {'name':'gaoqi','age':18,'job':'programmer'}

通過(guò) [鍵] 獲得“值”。若鍵不存在,則拋出異常。

>>> a = {'name':'gaoqi','age':18,'job':'programmer'}

>>> a['name']

'gaoqi'

>>> a['age']

18

>>> a['sex']

Traceback (most recent call last):

File "", line 1, in

a['sex']

KeyError: 'sex'

通過(guò) get()方法獲得“值”。

推薦使用,優(yōu)點(diǎn)是:指定鍵不存在,返回 None,而不是拋出異常。

也可以設(shè)定指定鍵不存在時(shí)默認(rèn)返回的對(duì)象。

>>> a.get('name')

'gaoqi'

>>> a.get('sex')

>>> a.get('sex','一個(gè)男人')

'一個(gè)男人'

列出所有的鍵值對(duì)

>>> a.items()

dict_items([('name', 'gaoqi'), ('age', 18), ('job', 'programmer')])

列出所有的鍵,列出所有的值

>>> a.keys()

dict_keys(['name', 'age', 'job'])

>>> a.values()

dict_values(['gaoqi', 18, 'programmer'])

通過(guò)len()方法獲得鍵值對(duì)的個(gè)數(shù)

>>> print(len(a))

3

檢測(cè)一個(gè)“鍵”是否在字典中

>>> a = {"name":"gaoqi","age":18}

>>> "name" in a

True

字典元素添加、修改、刪除

給字典新增“鍵值對(duì)”

如果“鍵”已經(jīng)存在,則覆蓋舊的鍵值對(duì);如果“鍵”不存在,則新增“鍵值對(duì)”。

>>>a = {'name':'gaoqi','age':18,'job':'programmer'}

>>> a['address']='西三旗 1 號(hào)院'

>>> a['age']=16

>>> a

{'name': 'gaoqi', 'age': 16, 'job': 'programmer', 'address': '西三旗 1 號(hào)院'}

使用 update()

將新字典中所有鍵值對(duì)全部添加到舊字典對(duì)象上。如果 key 有重復(fù),則直接覆蓋。

>>> a = {'name':'gaoqi','age':18,'job':'programmer'}

>>> b = {'name':'gaoxixi','money':1000,'sex':'男的'}

>>> a.update(b)

>>> a

{'name': 'gaoxixi', 'age': 18, 'job': 'programmer', 'money': 1000, 'sex': '男的'}

字典中元素的刪除

可以使用 del()方法;或者 clear()刪除所有鍵值對(duì);pop()刪除指定鍵值對(duì),并返回對(duì)應(yīng)的“值對(duì)象”;

>>> a = {'name':'gaoqi','age':18,'job':'programmer'}

>>> del(a['name'])

>>> a

{'age': 18, 'job': 'programmer'}

>>> b = a.pop('age')

>>> b

18

popitem()

隨機(jī)刪除和返回該鍵值對(duì)。字典是“無(wú)序可變序列”,因此沒(méi)有第一個(gè)元

素、最后一個(gè)元素的概念;popitem 彈出隨機(jī)的項(xiàng),因?yàn)樽值洳](méi)有"最后的元素"或者其

他有關(guān)順序的概念。若想一個(gè)接一個(gè)地移除并處理項(xiàng),這個(gè)方法就非常有效(因?yàn)椴挥檬紫?/p>

獲取鍵的列表)。

>>> a = {'name':'gaoqi','age':18,'job':'programmer'}

>>> a.popitem()

('job', 'programmer')

>>> a

{'name': 'gaoqi', 'age': 18}

>>> a.popitem()

('age', 18)

>>> a

{'name': 'gaoqi'}

序列解包

序列解包可以用于元組、列表、字典。

序列解包可以讓我們方便的對(duì)多個(gè)變量賦值。

>>> x,y,z=(20,30,10)

>>> x

20

>>> y

30

>>> z

10

>>> (a,b,c)=(9,8,10)

>>> a

9

>>> [a,b,c]=[10,20,30]

>>> a

10

>>> b

20

序列解包用于字典時(shí)

默認(rèn)是對(duì)“鍵”進(jìn)行操作; 如果需要對(duì)鍵值對(duì)操作,則需要使用items();如果需要對(duì)“值”進(jìn)行操作,則需要使用 values();

>>> s = {'name':'gaoqi','age':18,'job':'teacher'}

>>> name,age,job=s #默認(rèn)對(duì)鍵進(jìn)行操作

>>> name

'name'

>>> name,age,job=s.items() #對(duì)鍵值對(duì)進(jìn)行操作

>>> name

('name', 'gaoqi')

>>> name,age,job=s.values() #對(duì)值進(jìn)行操作

>>> name

'gaoqi'

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

字典對(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"]="gaoqi"

假設(shè)字典 a 對(duì)象創(chuàng)建完后,數(shù)組長(zhǎng)度為 8:

我們要把”name”=”gaoqi”這個(gè)鍵值對(duì)放到字典對(duì)象 a 中,首先第一步需要計(jì)算鍵”name”的散列值。Python 中可以通過(guò) hash()來(lái)計(jì)算。

>>> bin(hash("name"))

'-0b1010111101001110110101100100101'

由于數(shù)組長(zhǎng)度為 8,我們可以拿計(jì)算出的散列值的最右邊 3 位數(shù)字作為偏移量,即“101”,十進(jìn)制是數(shù)字 5。我們查看偏移量 5,對(duì)應(yīng)的 bucket 是否為空。如果為空,則將鍵值對(duì)放進(jìn)去。如果不為空,則依次取右邊 3 位作為偏移量,即“100”,十進(jìn)制是數(shù)字4。再查看偏移量為 4 的 bucket 是否為空。直到找到為空的 bucket 將鍵值對(duì)放進(jìn)去。流程圖如下:

擴(kuò)容

python 會(huì)根據(jù)散列表的擁擠程度擴(kuò)容。“擴(kuò)容”指的是:創(chuàng)造更大的數(shù)組,將原有內(nèi)容

拷貝到新數(shù)組中。接近 2/3 時(shí),數(shù)組就會(huì)擴(kuò)容。

根據(jù)鍵查找“鍵值對(duì)”的底層過(guò)程

我們明白了,一個(gè)鍵值對(duì)是如何存儲(chǔ)到數(shù)組中的,根據(jù)鍵對(duì)象取到值對(duì)象,理解起來(lái)就簡(jiǎn)單了。

>>> a.get("name")

'gaoqi'

當(dāng)我們調(diào)用 a.get(“name”),就是根據(jù)鍵“name”查找到“鍵值對(duì)”,從而找到值對(duì)象“gaoqi”。

第一步,我們?nèi)匀灰?jì)算“name”對(duì)象的散列值:

>>> bin(hash("name"))

'-0b1010111101001110110101100100101'

和存儲(chǔ)的底層流程算法一致,也是依次取散列值的不同位置的數(shù)字。 假設(shè)數(shù)組長(zhǎng)度為8,我們可以拿計(jì)算出的散列值的最右邊 3 位數(shù)字作為偏移量,即“101”,十進(jìn)制是數(shù)字5。我們查看偏移量 5,對(duì)應(yīng)的 bucket 是否為空。如果為空,則返回 None。如果不為空,則將這個(gè) bucket 的鍵對(duì)象計(jì)算對(duì)應(yīng)散列值,和我們的散列值進(jìn)行比較,如果相等。則將對(duì)應(yīng)“值對(duì)象”返回。如果不相等,則再依次取其他幾位數(shù)字,重新計(jì)算偏移量。依次取完后,仍然沒(méi)有找到。則返回 None。流程圖如下:

用法總結(jié):

鍵必須可散列

數(shù)字、字符串、元組,都是可散列的。

自定義對(duì)象需要支持下面三點(diǎn):

支持 hash()函數(shù)

支持通過(guò)__eq__()方法檢測(cè)相等性。

若 a==b 為真,則 hash(a)==hash(b)也為真。

字典在內(nèi)存中開(kāi)銷巨大,典型的空間換時(shí)間。

鍵查詢速度很快

往字典里面添加新建可能導(dǎo)致擴(kuò)容,導(dǎo)致散列表中鍵的次序變化。因此,不要在遍歷字典的同時(shí)進(jìn)行字典的修改。

總結(jié)

以上是生活随笔為你收集整理的python字典定义方式_Python字典常用方法及汇总的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。