铁乐学Python_day05-字典dict
1、【字典dict】
Python內(nèi)置了字典:dict的支持,dict全稱dictionary,
在其他語言中也稱為map,使用鍵-值(key-value)存儲,具有極快的查找速度。
字典和列表直觀上不同的是,字典用的是方括弧’{}’括起來,列表用的是方括號’[]’。
例,假設(shè)要根據(jù)hero3人族兵種的級別查找對應(yīng)的兵種,如果用list實現(xiàn),需要兩個list:
Lv = [‘Lv1’, ‘Lv2’, ‘lv3’]
hum_soldier = [‘槍兵’, ‘射手’, ‘獅鷲’]
給定一個級別,要查找對應(yīng)的hum_soldier,就先要在Lv中找到對應(yīng)的位置,
再從hum_soldier取出對應(yīng)的兵種,list越長,耗時越長。
如果用dict實現(xiàn),只需要一個“Lv”-“hum_soldier”的對照表,直接根據(jù)級別查找兵種,
無論這個表有多大,查找速度都不會變慢。(但是會占的內(nèi)存比LIST多)
字典這種采用鍵值對的方式(key-value),儲存大量關(guān)系性的數(shù)據(jù),查詢速度快。
字典的值:任意數(shù)據(jù)類型。只有值能對應(yīng)上所有類型,它的鍵只可以對應(yīng)上不可變類型的數(shù)據(jù)。
字典的鍵:屬于不可變數(shù)據(jù)類型。且不能重復(fù),唯一。
所以鍵可以是int,bool,str,tuple,但不能是列表。
如果你建立兩個相同的鍵,后賦值那個會覆蓋前面那個同名的鍵。
字典的順序:
3.5之前,字典是無序的。
3.6開始,有優(yōu)化,字典創(chuàng)建的時候,按照一定的順序插入的數(shù)值,看起來變得更有序。
數(shù)據(jù)類型分類:
可變(不可哈希):list,dict,set(集合)—unhashable type
不可變(可哈希):int,bool,str,tuple —hashable type
對于不變對象來說,調(diào)用對象自身的任意方法,也不會改變該對象自身的內(nèi)容。相反,這些方法會創(chuàng)建新的對象并返回,這樣,就保證了不可變對象本身永遠是不可變的。
(對原值沒有發(fā)生改變,只是形成一個新的)
按容器(可承載各種數(shù)據(jù)類型)類型分:
容器類:list,tuple,dict
list列表,查詢速度從頭遍歷到尾
disc字典,二分查找(有一個哈希表,每一個鍵[唯一]對應(yīng)一個哈希值。
2、對字典的操作;
【增】加鍵值的方法學(xué)習(xí)兩種:
第一種:直接通過鍵修改值;
有則覆蓋(改),無則添加。和列表的索引增加類似。
hum_soldier = {'lv1':'槍兵', 'lv2':'射手', 'lv3':'獅鷲'} hum_soldier['lv4'] = '劍士' print(hum_soldier)可以看到無則添加成: {'lv4': '劍士', 'lv2': '射手', 'lv1': '槍兵', 'lv3': '獅鷲'}有則覆蓋的例子,上面中l(wèi)v1的鍵值對己有,我現(xiàn)在直接覆蓋修改成兵種變成農(nóng)民: hum_soldier['lv1'] = '農(nóng)民' print(hum_soldier)效果:{'lv2': '射手', 'lv4': '劍士', 'lv3': '獅鷲', 'lv1': '農(nóng)民'}所以如果不確定數(shù)據(jù)有沒有,及數(shù)據(jù)不可以覆蓋的情況下,建議用到接下來要說的第二種:
第二種:setdeafult(),無則添加,有則不變。對數(shù)據(jù)的保護更高,更嚴(yán)謹(jǐn)。
如果 key 在 字典中,返回對應(yīng)的值。
如果不在字典中,則插入 key 及設(shè)置的默認(rèn)值 default,并返回 default ,default 默認(rèn)值為 None。
比如同樣接上文的例子,使用setdeafult()方法添加一組原來沒有的鍵值對:
hum_soldier.setdefault('lv5', '僧侶') print(hum_soldier)輸出可看到有添加: {'lv1': '農(nóng)民', 'lv2': '射手', 'lv5': '僧侶', 'lv3': '獅鷲', 'lv4': '劍士'}再添加原來便有的lv2鍵嘗試: hum_soldier.setdefault('lv2', '神射手') print(hum_soldier)輸出看到?jīng)]有變化,lv2鍵對應(yīng)的值依然是射手: {'lv3': '獅鷲', 'lv2': '射手', 'lv5': '僧侶', 'lv4': '劍士', 'lv1': '農(nóng)民'}注意:同樣由于setdefault()的這個特性,最好只在數(shù)據(jù)沒有添加也不影響或有檢查反饋的場合下用。hum_soldier.setdefault('lv6') 也可以單純只加一個鍵,默認(rèn)鍵值為None,None也是常常會預(yù)留的。 很多時候我們新建的一個字典,就是先建好鍵,值都是默認(rèn)None,后面再或獲取或填入的。 {'lv3': '獅鷲', 'lv1': '農(nóng)民', 'lv4': '劍士', 'lv2': '射手', 'lv6': None, 'lv5': '僧侶'}利用setdeafult()的返回值特性,我們還可以嘗試進行這樣的操作:
hum_soldier = {'lv1': '農(nóng)民', 'lv2': '射手', 'lv6': None, 'lv3': '獅鷲', 'lv5': '僧侶', 'lv4': '劍士'}print('人類的一級兵種是:%s' % hum_soldier.setdefault('lv1', None)) print('人族的七級兵種是:%s' % hum_soldier.setdefault('lv7', None)) print(hum_soldier)顯示: 人類的一級兵種是:農(nóng)民 人族的七級兵種是:None {'lv1': '農(nóng)民', 'lv6': None, 'lv5': '僧侶', 'lv3': '獅鷲', 'lv2': '射手', 'lv7': None, 'lv4': '劍士'}【刪除】的方法我們來學(xué)習(xí)四種:
1)【pop(key[,default)】
字典 pop() 方法刪除字典給定鍵 key 所對應(yīng)的值,返回值為被刪除的值。
key值必須給出。 否則,返回default值。
例:
hum_soldier = {'lv1': '農(nóng)民', 'lv2': '射手', 'lv6': None, 'lv3': '獅鷲', 'lv5': '僧侶', 'lv4': '劍士'} print(hum_soldier.pop('lv1')) print(hum_soldier)顯示: 農(nóng)民 {'lv6': None, 'lv4': '劍士', 'lv7': None, 'lv5': '僧侶', 'lv3': '獅鷲', 'lv2': '射手'}hum_soldier.pop('lv8') #刪除的時候沒有此鍵的時候會報錯 報錯 Traceback (most recent call last):File "E:/Python/day05/dict.py", line 26, in <module>print(hum_soldier.pop('lv8')) KeyError: 'lv8'hum_soldier.pop('lv9', None) #建議以這種寫法,不報錯而是返回你設(shè)定的值,一般是None來提醒自已沒有此鍵。 返回 None2)【popitem(key[,default)】
字典 popitem() 方法隨機返回并刪除字典中的一對鍵和值(一般刪除末尾對)。
如果字典已經(jīng)為空,卻調(diào)用了此方法,就報出KeyError異常。
3)【clear()】清空字典所有元素,變空字典
例:
hum_soldier = {'lv1': '農(nóng)民', 'lv2': '射手', 'lv3': '獅鷲', 'lv5': '僧侶', 'lv4': '劍士'} print("人族兵種-字典長度為:%s" % len(hum_soldier)) hum_soldier.clear() print("人族兵種-字典長度現(xiàn)為:%s" % len(hum_soldier))返回結(jié)果: 人族兵種-字典長度為:5 人族兵種-字典長度現(xiàn)為:04)【del】不詳述,前面已有練習(xí)刪除列表等。
del dict 刪除字典
del dict[’key’] 刪除對應(yīng)鍵值,沒有時會報異常,所以建議一般使用pop來刪除。
【改】的方法我們來學(xué)習(xí)兩種:
第一種:直接通過鍵來修改(賦值)
hum_soldier = {'lv5': '僧侶', 'lv1': '農(nóng)民', 'lv3': '獅鷲', 'lv2': '射手', 'lv4': '劍士'} hum_soldier['lv1'] = '戟兵' print(hum_soldier)顯示: {'lv5': '僧侶', 'lv1': '戟兵', 'lv3': '獅鷲', 'lv2': '射手', 'lv4': '劍士'}第二種:update()方法
dict.update(dict2)
將dict2鍵/值對,更新(覆蓋并添加)到dict
(會覆蓋,有相同會覆蓋,沒有的添加,和同步更新有點像)
【查】的方法我們來學(xué)習(xí)三種
1)dict[‘key’]只能通過鍵查值,查不到的報錯
2)通過in也可以判斷key是否存在:
Python 字典 in 操作符用于判斷鍵是否存在于字典中,如果鍵在字典dict里返回true,否則返回false。
語法
in 操作符語法:
key in dict
參數(shù)
key – 要在字典中查找的鍵。
返回值
如果鍵在字典里返回true,否則返回false。
注意是鍵-key,而不要弄成了判斷值了。
3)dict.get(‘key’)通過鍵得到對應(yīng)的值,找不到鍵的默認(rèn)返回None。
語法
get()方法語法:
dict.get(key, default=None)
參數(shù)
key – 字典中要查找的鍵。
default – 如果指定鍵的值不存在時,返回該默認(rèn)值值。
返回值
返回指定鍵的值,如果值不在字典中返回默認(rèn)值 None。
例:
hum = {'lv4':'劍士', 'lv5':'僧侶', 'lv1':'農(nóng)民'} print('人族4級兵種為:%s' % hum.get('lv4'))顯示: 人族4級兵種為:劍士3、【其它方法】
dict.keys()
字典keys() 方法以列表返回一個字典所有的鍵。
把所有的鍵(不包括值)放到一個容器中,
本身沒什么用,類似于列表(但沒有索引),可以用于for循環(huán)迭代打印輸出所有鍵等。
dict.keys() 循環(huán)打印出所有鍵時,等同直接dict;
(另外可用list轉(zhuǎn)換成列表:list(dic.keys()))
特殊類型轉(zhuǎn)換 dict 轉(zhuǎn)化成 list,類似:
dict.values()
字典 values() 方法以列表返回字典中的所有值。
與keys相對,這次是把所有值放到一個列表中。與keys()用法可觸類旁通,不再詳述。
dict.items()
字典 items() 方法以列表返回可遍歷的(鍵, 值) 元組數(shù)組。
這個就厲害了,返回的是成對的鍵/值,而且是遍歷。
例:
hum = {'lv4':'劍士', 'lv5':'僧侶', 'lv1':'農(nóng)民'} print(hum.items())顯示結(jié)果: dict_items([('lv4', '劍士'), ('lv5', '僧侶'), ('lv1', '農(nóng)民')])字典 fromkeys()方法
fromkeys()方法從序列鍵和值設(shè)置為value來創(chuàng)建一個新的字典。
dict.fromkeys(seq[, value]))
參數(shù)
seq – 這是將用于字典的鍵準(zhǔn)備的值的列表。一般為可迭代的對像。
value – 這是可選的,如果提供的話則值將被設(shè)置為這個值。
例:
dic ={} lv1_soldier = ['骷髏', '槍兵', '小鬼', '大耳怪', '半人馬', '小精靈', '妖精'] dic = dic.fromkeys(lv1_soldier, 'lv1') print(dic){'小鬼': 'lv1', '小精靈': 'lv1', '槍兵': 'lv1', '妖精': 'lv1', '半人馬': 'lv1', '骷髏': 'lv1', '大耳怪': 'lv1'}【分別賦值】
a,b = 2,3
a,b = (2,3)
a,b = [2,3] #前提,數(shù)量一一對應(yīng)得上
輸出的結(jié)果都是a=2 b=3
a = 4 , b = 5 只用一行代碼賦值a和b的值互換?(面試題)
a,b = b,a
擴展,因為鍵和值也是成對的,所以很多情況下也可以用到分別(雙雙)賦值的這個技巧。
還可以加上for循環(huán)遍歷技巧。
for k,v in dict.items()
這里的循環(huán)對應(yīng)的k和v就是取字典里的鍵/值對。
【字典 dict.zip() 迭代分別賦值給鍵和值?!?/h4>
兩個列表合并成字典
例:
hum_soldier = ['槍兵', '射手', '獅鷲', '劍士', '僧侶', '騎士', '天使'] lv = ['lv' + str(i) for i in range(1,8)] #列表推導(dǎo)式直接做出lv1到lv7 print(lv) dic = dict(zip(lv, hum_soldier)) #分別對應(yīng)列表順序賦值給字典 print(dic)['lv1', 'lv2', 'lv3', 'lv4', 'lv5', 'lv6', 'lv7'] {'lv2': '射手', 'lv1': '槍兵', 'lv5': '僧侶', 'lv4': '劍士', 'lv7': '天使', 'lv3': '獅鷲', 'lv6': '騎士'}使用zip函數(shù)還可以很方便反轉(zhuǎn)鍵值(原本的值當(dāng)鍵,原本的鍵變成值) 例如接上例繼續(xù)操作反轉(zhuǎn):dic = dict(zip(dic.values(), dic.keys())) print(dic) {'獅鷲': 'lv3', '射手': 'lv2', '槍兵': 'lv1', '僧侶': 'lv5', '騎士': 'lv6', '劍士': 'lv4', '天使': 'lv7'}4、【字典的嵌套】
字典通過鍵找值,列表通過索引找值;
例:
文:鐵樂與貓
2018-3-22
end
總結(jié)
以上是生活随笔為你收集整理的铁乐学Python_day05-字典dict的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 有你真好,我的程序员老公
- 下一篇: Games101-课程15笔记