您好,登錄后才能下訂單哦!
本文實(shí)例講述了Python字典的概念及常見應(yīng)用。分享給大家供大家參考,具體如下:
字典是“鍵值對”的無序可變序列,字典中的每個(gè)元素都是一個(gè)“鍵值對”,包含:“鍵
對象”和“值對象”??梢酝ㄟ^“鍵對象”實(shí)現(xiàn)快速獲取、刪除、更新對應(yīng)的“值對象”。
列表中我們通過“下標(biāo)數(shù)字”找到對應(yīng)的對象。字典中通過“鍵對象”找到對應(yīng)的“值
對象”?!版I”是任意的不可變數(shù)據(jù),比如:整數(shù)、浮點(diǎn)數(shù)、字符串、元組。但是:列表、
字典、集合這些可變對象,不能作為“鍵”。并且“鍵”不可重復(fù)。
“值”可以是任意的數(shù)據(jù),并且可重復(fù)。
一個(gè)典型的字典的定義方式:
a = {'name':'gaoqi','age':18,'job':'programmer'}
>>> a = {'name':'gaoqi','age':18,'job':'programmer'} >>> b = dict(name='gaoqi',age=18,job='programmer') >>> a = dict([("name","gaoqi"),("age",18)]) >>> c = {} #空的字典對象 >>> d = dict() #空的字典對象
>>> k = ['name','age','job'] >>> v = ['gaoqi',18,'techer'] >>> d = dict(zip(k,v)) >>> d {'name': 'gaoqi', 'age': 18, 'job': 'techer'}
>>> a = dict.fromkeys(['name','age','job']) >>> a {'name': None, 'age': None, 'job': None}
為了測試各種訪問方法,我們這里設(shè)定一個(gè)字典對象:
a = {'name':'gaoqi','age':18,'job':'programmer'}
>>> a = {'name':'gaoqi','age':18,'job':'programmer'} >>> a['name'] 'gaoqi' >>> a['age'] 18 >>> a['sex'] Traceback (most recent call last): File "<pyshell#374>", line 1, in <module> a['sex'] KeyError: 'sex'
定指定鍵不存在時(shí)默認(rèn)返回的對象。推薦使用 get()獲取“值對象”。
>>> a.get('name') 'gaoqi' >>> a.get('sex') >>> a.get('sex','一個(gè)男人') '一個(gè)男人'
>>> a.items() dict_items([('name', 'gaoqi'), ('age', 18), ('job', 'programmer')])
>>> a.keys() dict_keys(['name', 'age', 'job']) >>> a.values() dict_values(['gaoqi', 18, 'programmer'])
>>> a = {"name":"gaoqi","age":18} >>> "name" in a True
如果“鍵”已經(jīng)存在,則覆蓋舊的鍵值對;如果“鍵”不存在,則新增“鍵值對”。
>>>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)院'}
將新字典中所有鍵值對全部添加到舊字典對象上。如果 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()刪除所有鍵值對;pop()刪除指定鍵值對,并返回對應(yīng)的“值對象”;
>>> a = {'name':'gaoqi','age':18,'job':'programmer'} >>> del(a['name']) >>> a {'age': 18, 'job': 'programmer'} >>> b = a.pop('age') >>> b 18
隨機(jī)刪除和返回該鍵值對。字典是“無序可變序列”,因此沒有第一個(gè)元
素、最后一個(gè)元素的概念;popitem 彈出隨機(jī)的項(xiàng),因?yàn)樽值洳]有"最后的元素"或者其
他有關(guān)順序的概念。若想一個(gè)接一個(gè)地移除并處理項(xiàng),這個(gè)方法就非常有效(因?yàn)椴挥檬紫?br />
獲取鍵的列表)。
>>> a = {'name':'gaoqi','age':18,'job':'programmer'} >>> a.popitem() ('job', 'programmer') >>> a {'name': 'gaoqi', 'age': 18} >>> a.popitem() ('age', 18) >>> a {'name': 'gaoqi'}
序列解包可以讓我們方便的對多個(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
默認(rèn)是對“鍵”進(jìn)行操作; 如果需要對鍵值對操作,則需要使用items();如果需要對“值”進(jìn)行操作,則需要使用 values();
>>> s = {'name':'gaoqi','age':18,'job':'teacher'} >>> name,age,job=s #默認(rèn)對鍵進(jìn)行操作 >>> name 'name' >>> name,age,job=s.items() #對鍵值對進(jìn)行操作 >>> name ('name', 'gaoqi') >>> name,age,job=s.values() #對值進(jìn)行操作 >>> name 'gaoqi'
姓名 | 年齡 | 薪資 | 城市 |
---|---|---|---|
高小一 | 18 | 30000 | 北京 |
高小二 | 19 | 20000 | 上海 |
高小五 | 20 | 10000 | 深圳 |
源代碼(mypy_09.py):
r1 = {"name":"高小一","age":18,"salary":30000,"city":"北京"} r2 = {"name":"高小二","age":19,"salary":20000,"city":"上海"} r3 = {"name":"高小五","age":20,"salary":10000,"city":"深圳"} tb = [r1,r2,r3] #獲得第二行的人的薪資 print(tb[1].get("salary")) #打印表中所有的的薪資 for i in range(len(tb)): # i -->0,1,2 print(tb[i].get("salary")) #打印表的所有數(shù)據(jù) for i in range(len(tb)): print(tb[i].get("name"),tb[i].get("age"),tb[i].get("salary"),tb[i].get("city"))
字典對象的核心是散列表。散列表是一個(gè)稀疏數(shù)組(總是有空白元素的數(shù)組),數(shù)組的
每個(gè)單元叫做 bucket。每個(gè) bucket 有兩部分:一個(gè)是鍵對象的引用,一個(gè)是值對象的引
用。
由于,所有 bucket 結(jié)構(gòu)和大小一致,我們可以通過偏移量來讀取指定 bucket。
>>> a = {} >>> a["name"]="gaoqi"
假設(shè)字典 a 對象創(chuàng)建完后,數(shù)組長度為 8:
我們要把”name”=”gaoqi”這個(gè)鍵值對放到字典對象 a 中,首先第一步需要計(jì)算
鍵”name”的散列值。Python 中可以通過 hash()來計(jì)算。
>>> bin(hash("name")) '-0b1010111101001110110101100100101'
由于數(shù)組長度為 8,我們可以拿計(jì)算出的散列值的最右邊 3 位數(shù)字作為偏移量,即
“101”,十進(jìn)制是數(shù)字 5。我們查看偏移量 5,對應(yīng)的 bucket 是否為空。如果為空,則
將鍵值對放進(jìn)去。如果不為空,則依次取右邊 3 位作為偏移量,即“100”,十進(jìn)制是數(shù)字
4。再查看偏移量為 4 的 bucket 是否為空。直到找到為空的 bucket 將鍵值對放進(jìn)去。流
程圖如下:
python 會(huì)根據(jù)散列表的擁擠程度擴(kuò)容?!皵U(kuò)容”指的是:創(chuàng)造更大的數(shù)組,將原有內(nèi)容
拷貝到新數(shù)組中。
接近 2/3 時(shí),數(shù)組就會(huì)擴(kuò)容。
我們明白了,一個(gè)鍵值對是如何存儲(chǔ)到數(shù)組中的,根據(jù)鍵對象取到值對象,理解起來就
簡單了。
>>> a.get("name") 'gaoqi'
當(dāng)我們調(diào)用 a.get(“name”),就是根據(jù)鍵“name”查找到“鍵值對”,從而找到值
對象“gaoqi”。
第一步,我們?nèi)匀灰?jì)算“name”對象的散列值:
>>> bin(hash("name")) '-0b1010111101001110110101100100101'
和存儲(chǔ)的底層流程算法一致,也是依次取散列值的不同位置的數(shù)字。 假設(shè)數(shù)組長度為
8,我們可以拿計(jì)算出的散列值的最右邊 3 位數(shù)字作為偏移量,即“101”,十進(jìn)制是數(shù)字
5。我們查看偏移量 5,對應(yīng)的 bucket 是否為空。如果為空,則返回 None。如果不為空,
則將這個(gè) bucket 的鍵對象計(jì)算對應(yīng)散列值,和我們的散列值進(jìn)行比較,如果相等。則將對
應(yīng)“值對象”返回。如果不相等,則再依次取其他幾位數(shù)字,重新計(jì)算偏移量。依次取完后,
仍然沒有找到。則返回 None。流程圖如下:
更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python字典操作技巧匯總》、《Python列表(list)操作技巧總結(jié)》、《Python函數(shù)使用技巧總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python字符串操作技巧匯總》及《Python入門與進(jìn)階經(jīng)典教程》
希望本文所述對大家Python程序設(shè)計(jì)有所幫助。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。