Python程序設(shè)計(jì)基礎(chǔ)-Chap08-字典課件_第1頁
Python程序設(shè)計(jì)基礎(chǔ)-Chap08-字典課件_第2頁
Python程序設(shè)計(jì)基礎(chǔ)-Chap08-字典課件_第3頁
Python程序設(shè)計(jì)基礎(chǔ)-Chap08-字典課件_第4頁
Python程序設(shè)計(jì)基礎(chǔ)-Chap08-字典課件_第5頁
已閱讀5頁,還剩65頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第8章字典第8章字典內(nèi)容提綱8.1什么是字典28.2字典的創(chuàng)建和使用38.3字典的基本操作4358.4字典的格式化字符串18.5字典的實(shí)例應(yīng)用內(nèi)容提綱8.1什么是字典28.2字典的創(chuàng)建和使用38引例引例假設(shè)有一種表格,第一列表示學(xué)號(hào),第二列表示學(xué)號(hào)所對(duì)應(yīng)的學(xué)生姓名,它們的關(guān)系一一對(duì)應(yīng)現(xiàn)在想查找學(xué)號(hào)是20170001的學(xué)生,我們從表中對(duì)應(yīng)的第二列,就能很方便地知道該學(xué)生的姓名是“張三”,如右表:20170001張三20170002李四20170003王五20170004趙六引例20170001張三20170002李四201700038.1什么是字典字典是Python語言中唯一的映射類型。映射類型對(duì)象里哈希值和指向的對(duì)象,通常被認(rèn)為是可變的哈希表。字典對(duì)象是可變的,它是一個(gè)容器類型,能存儲(chǔ)任意個(gè)數(shù)的Python對(duì)象,其中也可包括其他容器類型。字典是Python中最強(qiáng)大的數(shù)據(jù)類型之一,它與列表、元組等其他序列類型的主要區(qū)別有以下幾點(diǎn)。(1)存取和訪問數(shù)據(jù)的方式不同。(2)映射類型中的數(shù)據(jù)是無序排列的。這和序列類型是不一樣的,序列類型是以數(shù)值序排列的。(3)映射類型用鍵直接“映射”到值。(4)字典支持索引操作(索引值為鍵值),但不支持切片操作,因?yàn)榍衅僮魇轻槍?duì)索引值具有連續(xù)性,而字典的鍵不具備連續(xù)性。(5)字典中的鍵必須不可變且不重復(fù),值可以是任何類型。8.1什么是字典字典是Python語言中唯一的映射類型。8.2字典的創(chuàng)建和使用字典就是用花括號(hào){}包裹的鍵值對(duì)的集合(鍵值對(duì)有時(shí)也被稱作項(xiàng)或元素)。在字典的創(chuàng)建過程中,要注意以下幾點(diǎn)。(1)鍵與值之間用冒號(hào)“:”分開;(2)項(xiàng)與項(xiàng)之間用逗號(hào)“,”分開;(3)字典中的鍵必須是唯一的,而值可以不唯一。8.2字典的創(chuàng)建和使用字典就是用花括號(hào){}包裹的鍵值對(duì)的8.2字典的創(chuàng)建和使用8.2.1直接創(chuàng)建字典創(chuàng)建一個(gè)空的字典:>>>mydict={}#創(chuàng)建一個(gè)空的字典>>>mydict#輸出此字典的內(nèi)容{}可知結(jié)果為空的。創(chuàng)建一個(gè)與引例相對(duì)應(yīng)的字典:>>>student={20170001:'張三',20170002:'李四',/20170003:'王五',20170004:'趙六',}8.2字典的創(chuàng)建和使用8.2.1直接創(chuàng)建字典8.2字典的創(chuàng)建和使用8.2.2通過dict函數(shù)創(chuàng)建字典dict函數(shù)是字典類的構(gòu)造函數(shù),也可以利用此函數(shù)來創(chuàng)建字典。創(chuàng)建一個(gè)空字典:>>>dict(){}還可以傳入鍵值對(duì)創(chuàng)建字典。>>>dict(a=1,b=2,c=3){'b':2,'a':1,'c':3}可以傳入映射函數(shù)創(chuàng)建字典。>>>dict(zip(['a','b'],[1,2])){'b':2,'a':1}8.2字典的創(chuàng)建和使用8.2.2通過dict函數(shù)創(chuàng)建8.2字典的創(chuàng)建和使用8.2.2通過dict函數(shù)創(chuàng)建字典dict函數(shù)是字典類的構(gòu)造函數(shù),也可以利用此函數(shù)來創(chuàng)建字典。創(chuàng)建一個(gè)空字典:>>>dict(){}還可以傳入鍵值對(duì)創(chuàng)建字典。>>>dict(a=1,b=2,c=3){'b':2,'a':1,'c':3}可以傳入映射函數(shù)創(chuàng)建字典。>>>dict(zip(['a','b'],[1,2])){'b':2,'a':1}8.2字典的創(chuàng)建和使用8.2.2通過dict函數(shù)創(chuàng)建8.2字典的創(chuàng)建和使用還可以傳入可迭代對(duì)象創(chuàng)建字典。>>>dict((('a',1),('b',2))){'b':2,'a':1}另外,也可以用dict函數(shù),對(duì)字典進(jìn)行如下操作:>>>mydict={'b':2,'a':1,'c':3}#定義一個(gè)字典mydict>>>a=dict(mydict)#將mydict作為dict函數(shù)的參數(shù)>>>print(a) #輸出字典a{'b':2,'a':1,'c':3}在創(chuàng)建完一個(gè)字典后,可以利用len函數(shù)來獲取字典的長(zhǎng)度,也就是獲取該字典中鍵值對(duì)的個(gè)數(shù)。下面求字典mydict的長(zhǎng)度。>>>len(mydict)3得到的結(jié)果為3,說明此字典中包含了3個(gè)鍵值對(duì)。8.2字典的創(chuàng)建和使用還可以傳入可迭代對(duì)象創(chuàng)建字典。8.2字典的創(chuàng)建和使用8.2.3字典的修改和刪除修改字典中已存在元素的值,操作如下:>>>dict={'Name':'huang','Age':20,'Class':'10'}>>>dict['Age']=30;#將鍵'Age'所對(duì)應(yīng)的值改為30>>>dict{'Class':'10','Age':30,'Name':'huang'}在實(shí)際操作過程中,還可以向字典添加元素(必須同時(shí)添加鍵值對(duì)),方法如下:>>>dict['School']="GDPU";#增加新的元素>>>dict{'Class':'10','Age':30,'Name':'huang','School':'GDPU'}可以看到,新增加的鍵值對(duì)'School':'GDPU’已經(jīng)成為字典的一個(gè)元素。8.2字典的創(chuàng)建和使用8.2.3字典的修改和刪除8.2字典的創(chuàng)建和使用當(dāng)要想刪除字典中的其一個(gè)元素時(shí),用del[多了一個(gè)空格]就行,其用法為[缺少標(biāo)點(diǎn)符號(hào)]>>>deldict['Name'];#刪除鍵是'Name'的元素>>>dict{'Class':'10','Age':30,'School':'GDPU'}從輸出的結(jié)果可知,鍵為'Name'的元素已不在字典中了。還可以用dict.clear()來清空詞典所有元素。>>>dict.clear()>>>dict{}[格式錯(cuò)亂,{}跑到陰影框的外面了]可知執(zhí)行此操作后,字典為空。clear是一個(gè)原地操作的方法,使得dict中的內(nèi)容全部被置空,里面所有的元素將被清除,成為一個(gè)空的字典。8.2字典的創(chuàng)建和使用當(dāng)要想刪除字典中的其一個(gè)元素時(shí),用8.2字典的創(chuàng)建和使用8.2.3字典的遍歷字典是一種特殊的集合,因此可以循環(huán)操作對(duì)其進(jìn)行遍歷。一般來說,對(duì)字典的遍歷有如下幾種形式。為了便于講述,可以先建立一個(gè)字典。>>>mydict={'Name':'huang','Age':20,'Class':'10'}[建議把這段移動(dòng)到開頭位置,否則,把“如下幾種形式”和后面的幾種形式給斷開了]1.遍歷字典的key(鍵)>>>foriinmydict:print(i)輸出結(jié)果為: ClassAgeName8.2字典的創(chuàng)建和使用8.2.3字典的遍歷8.2字典的創(chuàng)建和使用2.遍歷字典的value(值)>>>foriinmydict.values(): print(i)結(jié)果為:1020Huang可知,values()函數(shù)是對(duì)字典元素的值進(jìn)行操作的,此程序中的變量i[變量i是否要斜體?全書要統(tǒng)一一下]對(duì)應(yīng)字典中的每個(gè)元素的值。8.2字典的創(chuàng)建和使用2.遍歷字典的value(值)8.2字典的創(chuàng)建和使用3.遍歷字典的項(xiàng)(元素)>>>foriinmydict.items(): print(i)輸出結(jié)果為字典的所有元素:('Class','10')('Age',20)('Name','huang')此程序中的變量i對(duì)應(yīng)字典中的元素(包括健和值)8.2字典的創(chuàng)建和使用3.遍歷字典的項(xiàng)(元素)8.2字典的創(chuàng)建和使用4.遍歷字典的key-value>>>fori,jinmydict.items(): print(i,j)輸出結(jié)果如下:Class10Age20Namehuang此程序中的變量i對(duì)應(yīng)字典的鍵,變量j對(duì)應(yīng)字典的值。8.2字典的創(chuàng)建和使用4.遍歷字典的key-value8.3字典的基本操作8.3.1get函數(shù):訪問字典成員get()函數(shù)根據(jù)key獲取值。>>>d={'one':1,'two':2,'three':3}>>>print(d.get('two'))2>>>print(d.get('four'))#字典d中沒有'four'這個(gè)鍵輸出結(jié)果為:None8.3字典的基本操作8.3.1get函數(shù):訪問字典成8.3字典的基本操作get函數(shù)可以訪問字典中不存在的鍵,當(dāng)該鍵不存在時(shí)返回None,讀者可以參看前面所講的用索引的方式來獲取值,當(dāng)鍵不存在時(shí),系統(tǒng)會(huì)報(bào)錯(cuò),這是兩種方法獲取字典元素值的區(qū)別。建議大家在從字典取值時(shí),多用get()函數(shù)。8.3字典的基本操作get函數(shù)可以訪問字典中不存在的鍵,8.3字典的基本操作8.3.2copy函數(shù):返回一個(gè)具有相同鍵值的新字典>>>x={'one':1,'two':2,'three':3,'test':['a','b','c']}#創(chuàng)建一個(gè)字典x>>>print(x)#輸出字典x{'one':1,'two':2,'test':['a','b','c'],'three':3}>>>y=x.copy()#用copy函數(shù),將字典x復(fù)制到字典y中>>>print(y)#輸出字典y{'one':1,'two':2,'test':['a','b','c'],'three':3}8.3字典的基本操作8.3.2copy函數(shù):返回一個(gè)8.3字典的基本操作可以看到,用copy函數(shù)復(fù)制后,字典x和字典y具有相同的元素(鍵值對(duì)),y是x的一個(gè)副本。再看下面的操作:>>>y['three']=33#將字典y中鍵為'three'的元素值改為33>>>print(y){'one':1,'two':2,'test':['a','b','c'],'three':33}從輸出結(jié)果中,可以看到已經(jīng)成功修改。此時(shí),再來看看字典x的情況。>>>print(x){'one':1,'two':2,'test':['a','b','c'],'three':3}當(dāng)修改副本字典y中的值時(shí),不會(huì)對(duì)原字典x產(chǎn)生影響。下面再做如下操作:>>>y['test'].remove('c')>>>y{'one':1,'two':2,'test':['a','b'],'three':3}>>>x{'one':1,'two':2,'test':['a','b'],'three':3}8.3字典的基本操作可以看到,用copy函數(shù)復(fù)制后,字典8.3字典的基本操作大家從輸出結(jié)果可以看到,副本的操作影響到了原始字典。在復(fù)制的副本中對(duì)值進(jìn)行替換后,對(duì)原來的字典不產(chǎn)生影響,但是如果修改了副本(如增、刪操作),原始的字典也會(huì)被修改。deepcopy函數(shù)使用深復(fù)制,復(fù)制其包含所有的值,這個(gè)方法可以解決由于副本修改而使原始字典也變化的問題。deepcopy函數(shù)在使用前要導(dǎo)入,語法如下:>>>fromcopyimportdeepcopy>>>z=deepcopy(x)#使用deepcopy函數(shù)深度復(fù)制,注意與copy函數(shù)的區(qū)別>>>x{'one':1,'two':2,'test':['a','b','c'],'three':3}>>>z{'one':1,'two':2,'test':['a','b','c'],'three':3}8.3字典的基本操作大家從輸出結(jié)果可以看到,副本的操作影8.3字典的基本操作8.3.3pop函數(shù):刪除字典中對(duì)應(yīng)的鍵pop函數(shù)可以刪除字典中的鍵及其對(duì)應(yīng)的值。>>>d={'one':1,'two':2,'three':3}>>>d.pop('two')#刪除鍵'two'2>>>print(d){'one':1,'three':3}運(yùn)算結(jié)果顯示鍵'two'及其對(duì)應(yīng)的值都從字典中刪除了。8.3字典的基本操作8.3.3pop函數(shù):刪除字典中8.3字典的基本操作8.3.4romkeys函數(shù):用給定的鍵建立新的字典fromkeys函數(shù)可以用給定的鍵建立新的字典,鍵默認(rèn)對(duì)應(yīng)的值為None。>>>d=dict.fromkeys(['one','two','three'])>>>print(d)輸出:{'one':None,'two':None,'three':None}可見,fromkeys函數(shù)用給定的鍵值’one','two','three',建立了一個(gè)新的字典,但是每個(gè)鍵所對(duì)應(yīng)的值為None。8.3字典的基本操作8.3.4romkeys函數(shù):用8.3字典的基本操作8.3.5setdefault函數(shù):獲取與給定鍵相關(guān)聯(lián)的值類似于get方法,獲取與給定鍵相關(guān)聯(lián)的值,也可以在字典中不包含給定鍵的情況下設(shè)定相應(yīng)的鍵值。>>>d={'one':1,'two':2,'three':3}>>>d.setdefault('four',4)4>>>print(d)運(yùn)算結(jié)果:{'four':4,'one':1,'two':2,'three':3}8.3字典的基本操作8.3.5setdefault函8.3字典的基本操作8.3.6update函數(shù):用一個(gè)字典更新另外一個(gè)字典update函數(shù)可以用一個(gè)字典來更新另外一個(gè)字典。操作如下:>>>d={'one':123,'two':2,'three':3}>>>print(d){'one':123,'two':2,'three':3}8.3字典的基本操作8.3.6update函數(shù):用一8.3字典的基本操作8.3.7關(guān)鍵字in的應(yīng)用在前面所學(xué)的章節(jié)中,我們已經(jīng)對(duì)in關(guān)鍵字有了一定的認(rèn)識(shí),在字典中,可以用in關(guān)鍵字進(jìn)行如下操作。創(chuàng)建一個(gè)字典d:>>>d={'one':123,'two':2,'three':3}8.3字典的基本操作8.3.7關(guān)鍵字in的應(yīng)用8.3字典的基本操作1.用in關(guān)鍵字檢查key是否存在>>>'one'ind.keys()True'one'是字典d中的一個(gè)鍵,所以返回True>>>'five'ind.keys()False'five'不是字典d的鍵,所以返回False2.用in關(guān)鍵字檢查value是否存在>>>1ind.values()True1是字典d中的一個(gè)值,所以返回True>>>5ind.values()False5不是字典d的值,所以返回False。8.3字典的基本操作1.用in關(guān)鍵字檢查key是否存8.4字典的格式化字符串在前面的學(xué)習(xí)中,我們知道格式化字符串時(shí),Python使用一個(gè)字符串作為模板。模板中有格式符,這些格式符為真實(shí)值預(yù)留位置,并說明真實(shí)數(shù)值應(yīng)該呈現(xiàn)的格式。Python可以用一個(gè)元組將多個(gè)值傳遞給模板,每個(gè)值對(duì)應(yīng)一個(gè)格式符。>>>print("I'm%s.I'm%dyearsold"%('huang',20))輸出結(jié)果為:I'mhuang.I'm20yearsold8.4字典的格式化字符串8.3字典的基本操作還可以通過字典格式化字符串,Python中內(nèi)置有對(duì)字符串進(jìn)行格式化的操作%,在每個(gè)轉(zhuǎn)換說明符中的%字符后面,加上鍵(要用圓括號(hào)括起來),后面再跟上其他說明元素。只要所有給出的鍵都能在字典中找到,就可以獲得任意數(shù)量的轉(zhuǎn)換說明符。>>>temple="I'm%(name)s,I'm%(age)d.%(name)sisastudent,heis%(age)d">>>student={'name':'huang','age':20}>>>print(temple%student)輸出結(jié)果為:I'mhuang,I'm20.huangisastudent,heis208.3字典的基本操作還可以通過字典格式化字符串,Pyth8.5字典的排序8.5字典的排序Python中的字典反映的是一種映射關(guān)系,它在存儲(chǔ)過程中是無序的,所以輸出字典內(nèi)容時(shí)也是無序的。在實(shí)際應(yīng)用過程中,有時(shí)需要對(duì)字典進(jìn)行一定程度的排序。Python中字典的排序分為按“鍵”排序和按“值”排序。下面分別進(jìn)行講述。這里創(chuàng)建一個(gè)字典d:>>>d={"ok":1,"no":2,'huang':12,'gg':11,'hh':13}>>>print(d){'no':2,'gg':11,'huang':12,'hh':13,'ok':1}從輸出結(jié)果可看到,字典的輸出是沒有順序的。8.5字典的排序8.5字典的排序8.5字典的排序8.5.1sorted函數(shù)按key值對(duì)字典排序現(xiàn)在,要對(duì)字典d按鍵進(jìn)行排序,前提是,d的鍵是可排序的,我們查看字典d的鍵,都是字符串類型,因此是可以進(jìn)行排序的。執(zhí)行以下操作:>>>sorted(d.keys())['gg','hh','huang','no','ok']可知得到的是一個(gè)由字典所有鍵組成的一個(gè)列表序列。并沒有反映出字典的映射關(guān)系。再執(zhí)行以下程序:>>>sorted(d.items())[('gg',11),('hh',13),('huang',12),('no',2),('ok',1)]8.5字典的排序8.5.1sorted函數(shù)按key值8.5字典的排序8.5.2sorted函數(shù)按value值對(duì)字典排序?qū)ψ值渲械膙alue進(jìn)行排序,前提是value的類型是可排序的。對(duì)字典的value排序需要用到key參數(shù),如果要對(duì)字典d按值的降序排列,進(jìn)行如下操作:>>>sorted(d.items(),key=lambdae:e[1],reverse=True)[('hh',13),('huang',12),('gg',11),('no',2),('ok',1)]這里的d.items()實(shí)際上是將d轉(zhuǎn)換為可迭代對(duì)象,迭代對(duì)象的元素為('hh',13),('huang',12),('gg',11),('no',2),('ok',1),items()方法將字典的元素轉(zhuǎn)化為了元組,而這里key參數(shù)對(duì)應(yīng)的lambda表達(dá)式:lambdae:e[1]的意思則是選取元組中的第二個(gè)元素作為比較參數(shù),所以采用這種方法可以對(duì)字典的value進(jìn)行排序。注意排序后的返回值是一個(gè)列表,而原字典中的鍵值對(duì)被轉(zhuǎn)換為了list中的元組。8.5字典的排序8.5.2sorted函數(shù)按valu8.5字典的排序8.5.2sorted函數(shù)按value值對(duì)字典排序?qū)ψ值渲械膙alue進(jìn)行排序,前提是value的類型是可排序的。對(duì)字典的value排序需要用到key參數(shù),如果要對(duì)字典d按值的降序排列,進(jìn)行如下操作:>>>sorted(d.items(),key=lambdae:e[1],reverse=True)[('hh',13),('huang',12),('gg',11),('no',2),('ok',1)]這里的d.items()實(shí)際上是將d轉(zhuǎn)換為可迭代對(duì)象,迭代對(duì)象的元素為('hh',13),('huang',12),('gg',11),('no',2),('ok',1),items()方法將字典的元素轉(zhuǎn)化為了元組,而這里key參數(shù)對(duì)應(yīng)的lambda表達(dá)式:lambdae:e[1]的意思則是選取元組中的第二個(gè)元素作為比較參數(shù),所以采用這種方法可以對(duì)字典的value進(jìn)行排序。注意排序后的返回值是一個(gè)列表,而原字典中的鍵值對(duì)被轉(zhuǎn)換為了list中的元組。8.5字典的排序8.5.2sorted函數(shù)按valu8.6字典的實(shí)例應(yīng)用【例8-1】讀取一個(gè)英文文檔,實(shí)現(xiàn)以下功能。(1)輸出文檔中出現(xiàn)的所有字母,并統(tǒng)計(jì)每個(gè)字母出現(xiàn)的次數(shù)。(2)輸出文檔中所有的單詞,并找到出現(xiàn)頻率最高的十個(gè)單詞。(程序設(shè)計(jì)過程中,忽略字母的大小寫)分析:(1)讀取文件,用到open函數(shù),假設(shè)現(xiàn)在在Python的安裝目錄下有英文文檔,文件名為englishText.txt(2)文件成功讀取之后,要完成各英文字母的統(tǒng)計(jì),我們知道,英文字母一共是26個(gè),有以下方案可以實(shí)現(xiàn)。①生成26個(gè)變量,每個(gè)變量對(duì)應(yīng)一個(gè)字母,當(dāng)讀取過程中,出現(xiàn)某個(gè)字母時(shí),其對(duì)應(yīng)的變量增加1。這種設(shè)計(jì)可以完成對(duì)字母的統(tǒng)計(jì),但過程比較煩瑣,大家可自行完成。②生成一個(gè)具有26個(gè)元素的列表,將每個(gè)字母轉(zhuǎn)化為相應(yīng)的索引值,比如a->0,b->1,c->2……z->25,當(dāng)出現(xiàn)某個(gè)字母時(shí),其索引對(duì)應(yīng)的值加1,這樣也可以完成對(duì)字母的統(tǒng)計(jì)。8.6字典的實(shí)例應(yīng)用【例8-1】讀取一個(gè)英文文檔,實(shí)現(xiàn)以8.6字典的實(shí)例應(yīng)用建立一個(gè)tf.py文件,程序代碼如下:1. testFile=open("englishText.txt","r")#讀取文件2. zi=testFile.read()#read()函數(shù)是以單個(gè)字符的方式來返回3. lis=[0]*26#新建一個(gè)有26個(gè)元素的列表4. foriinzi:5. ifi.isalpha():#判斷讀取的字符是否為字母6. x=i.lower()#將讀取的字母轉(zhuǎn)化為小寫7. lis[ord(x)-97]+=1#將列表的索引值與字母的ASCII碼對(duì)應(yīng)起來8. print(lis)9. testFile.close()輸出結(jié)果為:[47,18,14,18,69,12,13,22,23,1,7,29,15,38,59,9,1,26,46,31,14,4,9,0,14,0]從結(jié)果可以知道,字母a出現(xiàn)了47次,字母b出現(xiàn)了18次,...,字母z出現(xiàn)了0次。8.6字典的實(shí)例應(yīng)用建立一個(gè)tf.py文件,程序代碼如下本章小結(jié)本章主要對(duì)Python中的字典進(jìn)行了詳細(xì)的介紹,字典是Python中最強(qiáng)大的數(shù)據(jù)類型之一,本章講解了什么是字典、創(chuàng)建字典和為字典賦值、字典的基本操作、映射類型操作符、映射相關(guān)的函數(shù)、字典的方法等內(nèi)容;并通過應(yīng)用舉例,深化字典的應(yīng)用。本章小結(jié)本章主要對(duì)Python中的字典進(jìn)行了詳細(xì)的介紹第8章字典第8章字典內(nèi)容提綱8.1什么是字典28.2字典的創(chuàng)建和使用38.3字典的基本操作4358.4字典的格式化字符串18.5字典的實(shí)例應(yīng)用內(nèi)容提綱8.1什么是字典28.2字典的創(chuàng)建和使用38引例引例假設(shè)有一種表格,第一列表示學(xué)號(hào),第二列表示學(xué)號(hào)所對(duì)應(yīng)的學(xué)生姓名,它們的關(guān)系一一對(duì)應(yīng)現(xiàn)在想查找學(xué)號(hào)是20170001的學(xué)生,我們從表中對(duì)應(yīng)的第二列,就能很方便地知道該學(xué)生的姓名是“張三”,如右表:20170001張三20170002李四20170003王五20170004趙六引例20170001張三20170002李四201700038.1什么是字典字典是Python語言中唯一的映射類型。映射類型對(duì)象里哈希值和指向的對(duì)象,通常被認(rèn)為是可變的哈希表。字典對(duì)象是可變的,它是一個(gè)容器類型,能存儲(chǔ)任意個(gè)數(shù)的Python對(duì)象,其中也可包括其他容器類型。字典是Python中最強(qiáng)大的數(shù)據(jù)類型之一,它與列表、元組等其他序列類型的主要區(qū)別有以下幾點(diǎn)。(1)存取和訪問數(shù)據(jù)的方式不同。(2)映射類型中的數(shù)據(jù)是無序排列的。這和序列類型是不一樣的,序列類型是以數(shù)值序排列的。(3)映射類型用鍵直接“映射”到值。(4)字典支持索引操作(索引值為鍵值),但不支持切片操作,因?yàn)榍衅僮魇轻槍?duì)索引值具有連續(xù)性,而字典的鍵不具備連續(xù)性。(5)字典中的鍵必須不可變且不重復(fù),值可以是任何類型。8.1什么是字典字典是Python語言中唯一的映射類型。8.2字典的創(chuàng)建和使用字典就是用花括號(hào){}包裹的鍵值對(duì)的集合(鍵值對(duì)有時(shí)也被稱作項(xiàng)或元素)。在字典的創(chuàng)建過程中,要注意以下幾點(diǎn)。(1)鍵與值之間用冒號(hào)“:”分開;(2)項(xiàng)與項(xiàng)之間用逗號(hào)“,”分開;(3)字典中的鍵必須是唯一的,而值可以不唯一。8.2字典的創(chuàng)建和使用字典就是用花括號(hào){}包裹的鍵值對(duì)的8.2字典的創(chuàng)建和使用8.2.1直接創(chuàng)建字典創(chuàng)建一個(gè)空的字典:>>>mydict={}#創(chuàng)建一個(gè)空的字典>>>mydict#輸出此字典的內(nèi)容{}可知結(jié)果為空的。創(chuàng)建一個(gè)與引例相對(duì)應(yīng)的字典:>>>student={20170001:'張三',20170002:'李四',/20170003:'王五',20170004:'趙六',}8.2字典的創(chuàng)建和使用8.2.1直接創(chuàng)建字典8.2字典的創(chuàng)建和使用8.2.2通過dict函數(shù)創(chuàng)建字典dict函數(shù)是字典類的構(gòu)造函數(shù),也可以利用此函數(shù)來創(chuàng)建字典。創(chuàng)建一個(gè)空字典:>>>dict(){}還可以傳入鍵值對(duì)創(chuàng)建字典。>>>dict(a=1,b=2,c=3){'b':2,'a':1,'c':3}可以傳入映射函數(shù)創(chuàng)建字典。>>>dict(zip(['a','b'],[1,2])){'b':2,'a':1}8.2字典的創(chuàng)建和使用8.2.2通過dict函數(shù)創(chuàng)建8.2字典的創(chuàng)建和使用8.2.2通過dict函數(shù)創(chuàng)建字典dict函數(shù)是字典類的構(gòu)造函數(shù),也可以利用此函數(shù)來創(chuàng)建字典。創(chuàng)建一個(gè)空字典:>>>dict(){}還可以傳入鍵值對(duì)創(chuàng)建字典。>>>dict(a=1,b=2,c=3){'b':2,'a':1,'c':3}可以傳入映射函數(shù)創(chuàng)建字典。>>>dict(zip(['a','b'],[1,2])){'b':2,'a':1}8.2字典的創(chuàng)建和使用8.2.2通過dict函數(shù)創(chuàng)建8.2字典的創(chuàng)建和使用還可以傳入可迭代對(duì)象創(chuàng)建字典。>>>dict((('a',1),('b',2))){'b':2,'a':1}另外,也可以用dict函數(shù),對(duì)字典進(jìn)行如下操作:>>>mydict={'b':2,'a':1,'c':3}#定義一個(gè)字典mydict>>>a=dict(mydict)#將mydict作為dict函數(shù)的參數(shù)>>>print(a) #輸出字典a{'b':2,'a':1,'c':3}在創(chuàng)建完一個(gè)字典后,可以利用len函數(shù)來獲取字典的長(zhǎng)度,也就是獲取該字典中鍵值對(duì)的個(gè)數(shù)。下面求字典mydict的長(zhǎng)度。>>>len(mydict)3得到的結(jié)果為3,說明此字典中包含了3個(gè)鍵值對(duì)。8.2字典的創(chuàng)建和使用還可以傳入可迭代對(duì)象創(chuàng)建字典。8.2字典的創(chuàng)建和使用8.2.3字典的修改和刪除修改字典中已存在元素的值,操作如下:>>>dict={'Name':'huang','Age':20,'Class':'10'}>>>dict['Age']=30;#將鍵'Age'所對(duì)應(yīng)的值改為30>>>dict{'Class':'10','Age':30,'Name':'huang'}在實(shí)際操作過程中,還可以向字典添加元素(必須同時(shí)添加鍵值對(duì)),方法如下:>>>dict['School']="GDPU";#增加新的元素>>>dict{'Class':'10','Age':30,'Name':'huang','School':'GDPU'}可以看到,新增加的鍵值對(duì)'School':'GDPU’已經(jīng)成為字典的一個(gè)元素。8.2字典的創(chuàng)建和使用8.2.3字典的修改和刪除8.2字典的創(chuàng)建和使用當(dāng)要想刪除字典中的其一個(gè)元素時(shí),用del[多了一個(gè)空格]就行,其用法為[缺少標(biāo)點(diǎn)符號(hào)]>>>deldict['Name'];#刪除鍵是'Name'的元素>>>dict{'Class':'10','Age':30,'School':'GDPU'}從輸出的結(jié)果可知,鍵為'Name'的元素已不在字典中了。還可以用dict.clear()來清空詞典所有元素。>>>dict.clear()>>>dict{}[格式錯(cuò)亂,{}跑到陰影框的外面了]可知執(zhí)行此操作后,字典為空。clear是一個(gè)原地操作的方法,使得dict中的內(nèi)容全部被置空,里面所有的元素將被清除,成為一個(gè)空的字典。8.2字典的創(chuàng)建和使用當(dāng)要想刪除字典中的其一個(gè)元素時(shí),用8.2字典的創(chuàng)建和使用8.2.3字典的遍歷字典是一種特殊的集合,因此可以循環(huán)操作對(duì)其進(jìn)行遍歷。一般來說,對(duì)字典的遍歷有如下幾種形式。為了便于講述,可以先建立一個(gè)字典。>>>mydict={'Name':'huang','Age':20,'Class':'10'}[建議把這段移動(dòng)到開頭位置,否則,把“如下幾種形式”和后面的幾種形式給斷開了]1.遍歷字典的key(鍵)>>>foriinmydict:print(i)輸出結(jié)果為: ClassAgeName8.2字典的創(chuàng)建和使用8.2.3字典的遍歷8.2字典的創(chuàng)建和使用2.遍歷字典的value(值)>>>foriinmydict.values(): print(i)結(jié)果為:1020Huang可知,values()函數(shù)是對(duì)字典元素的值進(jìn)行操作的,此程序中的變量i[變量i是否要斜體?全書要統(tǒng)一一下]對(duì)應(yīng)字典中的每個(gè)元素的值。8.2字典的創(chuàng)建和使用2.遍歷字典的value(值)8.2字典的創(chuàng)建和使用3.遍歷字典的項(xiàng)(元素)>>>foriinmydict.items(): print(i)輸出結(jié)果為字典的所有元素:('Class','10')('Age',20)('Name','huang')此程序中的變量i對(duì)應(yīng)字典中的元素(包括健和值)8.2字典的創(chuàng)建和使用3.遍歷字典的項(xiàng)(元素)8.2字典的創(chuàng)建和使用4.遍歷字典的key-value>>>fori,jinmydict.items(): print(i,j)輸出結(jié)果如下:Class10Age20Namehuang此程序中的變量i對(duì)應(yīng)字典的鍵,變量j對(duì)應(yīng)字典的值。8.2字典的創(chuàng)建和使用4.遍歷字典的key-value8.3字典的基本操作8.3.1get函數(shù):訪問字典成員get()函數(shù)根據(jù)key獲取值。>>>d={'one':1,'two':2,'three':3}>>>print(d.get('two'))2>>>print(d.get('four'))#字典d中沒有'four'這個(gè)鍵輸出結(jié)果為:None8.3字典的基本操作8.3.1get函數(shù):訪問字典成8.3字典的基本操作get函數(shù)可以訪問字典中不存在的鍵,當(dāng)該鍵不存在時(shí)返回None,讀者可以參看前面所講的用索引的方式來獲取值,當(dāng)鍵不存在時(shí),系統(tǒng)會(huì)報(bào)錯(cuò),這是兩種方法獲取字典元素值的區(qū)別。建議大家在從字典取值時(shí),多用get()函數(shù)。8.3字典的基本操作get函數(shù)可以訪問字典中不存在的鍵,8.3字典的基本操作8.3.2copy函數(shù):返回一個(gè)具有相同鍵值的新字典>>>x={'one':1,'two':2,'three':3,'test':['a','b','c']}#創(chuàng)建一個(gè)字典x>>>print(x)#輸出字典x{'one':1,'two':2,'test':['a','b','c'],'three':3}>>>y=x.copy()#用copy函數(shù),將字典x復(fù)制到字典y中>>>print(y)#輸出字典y{'one':1,'two':2,'test':['a','b','c'],'three':3}8.3字典的基本操作8.3.2copy函數(shù):返回一個(gè)8.3字典的基本操作可以看到,用copy函數(shù)復(fù)制后,字典x和字典y具有相同的元素(鍵值對(duì)),y是x的一個(gè)副本。再看下面的操作:>>>y['three']=33#將字典y中鍵為'three'的元素值改為33>>>print(y){'one':1,'two':2,'test':['a','b','c'],'three':33}從輸出結(jié)果中,可以看到已經(jīng)成功修改。此時(shí),再來看看字典x的情況。>>>print(x){'one':1,'two':2,'test':['a','b','c'],'three':3}當(dāng)修改副本字典y中的值時(shí),不會(huì)對(duì)原字典x產(chǎn)生影響。下面再做如下操作:>>>y['test'].remove('c')>>>y{'one':1,'two':2,'test':['a','b'],'three':3}>>>x{'one':1,'two':2,'test':['a','b'],'three':3}8.3字典的基本操作可以看到,用copy函數(shù)復(fù)制后,字典8.3字典的基本操作大家從輸出結(jié)果可以看到,副本的操作影響到了原始字典。在復(fù)制的副本中對(duì)值進(jìn)行替換后,對(duì)原來的字典不產(chǎn)生影響,但是如果修改了副本(如增、刪操作),原始的字典也會(huì)被修改。deepcopy函數(shù)使用深復(fù)制,復(fù)制其包含所有的值,這個(gè)方法可以解決由于副本修改而使原始字典也變化的問題。deepcopy函數(shù)在使用前要導(dǎo)入,語法如下:>>>fromcopyimportdeepcopy>>>z=deepcopy(x)#使用deepcopy函數(shù)深度復(fù)制,注意與copy函數(shù)的區(qū)別>>>x{'one':1,'two':2,'test':['a','b','c'],'three':3}>>>z{'one':1,'two':2,'test':['a','b','c'],'three':3}8.3字典的基本操作大家從輸出結(jié)果可以看到,副本的操作影8.3字典的基本操作8.3.3pop函數(shù):刪除字典中對(duì)應(yīng)的鍵pop函數(shù)可以刪除字典中的鍵及其對(duì)應(yīng)的值。>>>d={'one':1,'two':2,'three':3}>>>d.pop('two')#刪除鍵'two'2>>>print(d){'one':1,'three':3}運(yùn)算結(jié)果顯示鍵'two'及其對(duì)應(yīng)的值都從字典中刪除了。8.3字典的基本操作8.3.3pop函數(shù):刪除字典中8.3字典的基本操作8.3.4romkeys函數(shù):用給定的鍵建立新的字典fromkeys函數(shù)可以用給定的鍵建立新的字典,鍵默認(rèn)對(duì)應(yīng)的值為None。>>>d=dict.fromkeys(['one','two','three'])>>>print(d)輸出:{'one':None,'two':None,'three':None}可見,fromkeys函數(shù)用給定的鍵值’one','two','three',建立了一個(gè)新的字典,但是每個(gè)鍵所對(duì)應(yīng)的值為None。8.3字典的基本操作8.3.4romkeys函數(shù):用8.3字典的基本操作8.3.5setdefault函數(shù):獲取與給定鍵相關(guān)聯(lián)的值類似于get方法,獲取與給定鍵相關(guān)聯(lián)的值,也可以在字典中不包含給定鍵的情況下設(shè)定相應(yīng)的鍵值。>>>d={'one':1,'two':2,'three':3}>>>d.setdefault('four',4)4>>>print(d)運(yùn)算結(jié)果:{'four':4,'one':1,'two':2,'three':3}8.3字典的基本操作8.3.5setdefault函8.3字典的基本操作8.3.6update函數(shù):用一個(gè)字典更新另外一個(gè)字典update函數(shù)可以用一個(gè)字典來更新另外一個(gè)字典。操作如下:>>>d={'one':123,'two':2,'three':3}>>>print(d){'one':123,'two':2,'three':3}8.3字典的基本操作8.3.6update函數(shù):用一8.3字典的基本操作8.3.7關(guān)鍵字in的應(yīng)用在前面所學(xué)的章節(jié)中,我們已經(jīng)對(duì)in關(guān)鍵字有了一定的認(rèn)識(shí),在字典中,可以用in關(guān)鍵字進(jìn)行如下操作。創(chuàng)建一個(gè)字典d:>>>d={'one':123,'two':2,'three':3}8.3字典的基本操作8.3.7關(guān)鍵字in的應(yīng)用8.3字典的基本操作1.用in關(guān)鍵字檢查key是否存在>>>'one'ind.keys()True'one'是字典d中的一個(gè)鍵,所以返回True>>>'five'ind.keys()False'five'不是字典d的鍵,所以返回False2.用in關(guān)鍵字檢查value是否存在>>>1ind.values()True1是字典d中的一個(gè)值,所以返回True>>>5ind.values()False5不是字典d的值,所以返回False。8.3字典的基本操作1.用in關(guān)鍵字檢查key是否存8.4字典的格式化字符串在前面的學(xué)習(xí)中,我們知道格式化字符串時(shí),Python使用一個(gè)字符串作為模板。模板中有格式符,這些格式符為真實(shí)值預(yù)留位置,并說明真實(shí)數(shù)值應(yīng)該呈現(xiàn)的格式。Python可以用一個(gè)元組將多個(gè)值傳遞給模板,每個(gè)值對(duì)應(yīng)一個(gè)格式符。>>>print("I'm%s.I'm%dyearsold"%('huang',20))輸出結(jié)果為:I'mhuang.I'm20yearsold8.4字典的格式化字符串8.3字典的基本操作還可以通過字典格式化字符串,Python中內(nèi)置有對(duì)字符串進(jìn)行格式化的操作%,在每個(gè)轉(zhuǎn)換說明符中的%字符后面,加上鍵(要用圓括號(hào)括起來),后面再跟上其他說明元素。只要所有給出的鍵都能在字典中找到,就可以獲得任意數(shù)量的轉(zhuǎn)換說明符。>>>temple="I'm%(name)s,I'm%(age)d.%(name)sisastudent,heis%(age)d">>>student={'name':'huang','age':20}>>>print(temple%student)輸出結(jié)果為:I'mhuang,I'm20.huangisastudent,heis208.3字典的基本操作還可以通過字典格式化字符串,Pyth8.5字典的排序8.5字典的排序Python中的字典反映的是一種映射關(guān)系,它在存儲(chǔ)過程中是無序的,所以輸出字典內(nèi)容時(shí)也是無序的。在實(shí)際應(yīng)用過程中,有時(shí)需要對(duì)字典進(jìn)行一定程度的排序。Python中字典的排序分為按“鍵”排序和按“值”排序。下面分別進(jìn)行講述。這里創(chuàng)建一個(gè)字典d:>>>d={"ok":1,"no":2,'huang':12,'gg':11,'hh':13}>>>print(d){'no':2,'gg':11,'huang':12,'hh':13,'ok':1}從輸出結(jié)果可看到,字典的輸出是沒有順序的。8.5字典的排序8.5字典的排序8.5字典的排序8.5.1sorted函數(shù)按key值對(duì)字典排序現(xiàn)在,要對(duì)字典d按鍵進(jìn)行排序,前提是,d的鍵是可排序的,我們查看字典d的鍵,都是字符串類型,因此是可以進(jìn)行排序的。執(zhí)行以下操作:>>>sorted(d.keys())['gg','hh','huang','no','ok']可知得到的是一個(gè)由字典所有鍵組成的一個(gè)列表序列。并沒有反映出字典的映射關(guān)系。再執(zhí)行以下程序:>>>sorted(d.items())[('gg',11),('hh',13),('huang',12),('no',2),('ok',1)]8.5字典的排序8.5.1sorted函數(shù)按key值8.5字典的排序8.5.2sorted函數(shù)按value值對(duì)字典排序?qū)ψ值渲械膙alue進(jìn)行排序,前提是value的類型是可排序的。對(duì)字典的value排序需要用到key參數(shù),如果要對(duì)字典d按值的降序排列,進(jìn)行如下操作:>>>sorted(d.items(),key=lambdae:e[1],reverse=True)[('hh',13),

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論