版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第3章Python常用數(shù)據(jù)結(jié)構(gòu)
導(dǎo)入在編程中,最常見的工作就是將數(shù)據(jù)進(jìn)行拆分或合并,將其加工為特定的形式,實(shí)現(xiàn)復(fù)雜數(shù)據(jù)的處理任務(wù)。在本章中,我們將學(xué)習(xí)Python常用的內(nèi)置數(shù)據(jù)結(jié)構(gòu),并將之前所學(xué)的數(shù)據(jù)類型以更為復(fù)雜的方式組織起來。這些組合數(shù)據(jù)結(jié)構(gòu)能夠把多個(gè)同類型或不同類型的數(shù)據(jù)組織起來統(tǒng)一表示,使數(shù)據(jù)操作更有序、更容易。學(xué)習(xí)目標(biāo)了解Python中的列表、元組、字符串、字典、集合等基本數(shù)據(jù)類型,了解它們的聯(lián)系和特點(diǎn);熟悉Python中列表、字典、集合的相關(guān)方法,以及個(gè)結(jié)構(gòu)間的轉(zhuǎn)換方法;掌握Python中的字符串、元組、列表、字典、集合的定義、創(chuàng)建,會(huì)使用切片方式訪問有序序列的值,掌握常見的內(nèi)建函數(shù),重點(diǎn)掌握各數(shù)據(jù)結(jié)構(gòu)的嵌套使用。主要內(nèi)容Python常用數(shù)據(jù)結(jié)構(gòu)概述列表(list)元組(tuple)字符串(str)與字節(jié)串(bytes)字典(dict)集合(set)各數(shù)據(jù)結(jié)構(gòu)之間的轉(zhuǎn)換3.1Python常用數(shù)據(jù)結(jié)構(gòu)概述Python3的組合數(shù)據(jù)類型分別為:1、序列類型:序列類型是一個(gè)元素向量,元素之間存在先后關(guān)系,通過序號(hào)訪問,Python中常用的序列類型包括列表(list)、元組(tuple)、字符串(str)等。2、映射類型:映射類型是“鍵-值”數(shù)據(jù)項(xiàng)的組合,每個(gè)元素是一個(gè)鍵值對(duì),表示為(key,value)Python中常用的映射類型是字典(map)。3、集合類型:集合類型是一個(gè)元素集合,元素之間無序,相同元素在集合中唯一存在,Python中常用的集合類型是集合(set)。3.2列表(list)列表(list)是Python中最基本的數(shù)據(jù)結(jié)構(gòu)。它由一系列按特定順序的元素組成。你可以創(chuàng)建包含字母表中的所有字母或所有家庭成員姓名的列表;也可以將任何東西加入列表,其中的元素可以沒有任何關(guān)系。創(chuàng)建一個(gè)列表后,可以訪問、修改、添加或刪除列表中的項(xiàng)目,即列表是可變的數(shù)據(jù)類型?!纠?-1】使用方括號(hào)[]創(chuàng)建列表。>>>list0=[]#創(chuàng)建空列表list0>>>list0[]>>>list1=[1,2,3,4,5]#創(chuàng)建數(shù)字列表list1>>>list1[1,2,3,4,5]>>>list2=["C","Python","Java"]#創(chuàng)建字符串列表list2>>>list2['C','Python','Java']3.2.1列表的定義、創(chuàng)建與訪問2、使用list()函數(shù)創(chuàng)建列表:Python還提供了一個(gè)內(nèi)置的函數(shù)list(),可以將其它數(shù)據(jù)類型轉(zhuǎn)換為列表類型?!纠?-2】使用list()函數(shù)創(chuàng)建列表>>>list0=list()#創(chuàng)建空列表list0>>>list0[]>>>list1=list(range(1,6))#將區(qū)間轉(zhuǎn)換成數(shù)字列表list1>>>list1[1,2,3,4,5]>>>list2=list("Python")#將字符串轉(zhuǎn)換成字符列表list2>>>list2['P','y','t','h','o','n']3.2.1列表的定義、創(chuàng)建與訪問列表是有序集合,如果要訪問列表的任何元素,只需將該元素的位置或者索引告訴Python即可,列表的索引體系有正向和反向兩種,兩套體系的索引編號(hào)可以任意搭配使用。如圖所示:列表類型的索引體系【例3-4】列表的正向索引體系>>>list3[0]#輸出列表第一個(gè)元素使用索引0aaa>>>list3[1]#輸出列表第二個(gè)元素使用索引1bbb3.2.1列表的定義、創(chuàng)建與訪問當(dāng)不知道列表到底有多少個(gè)元素,應(yīng)該怎樣找到該列表的最后一個(gè)元素呢?把索引值設(shè)置為-1時(shí),Python就會(huì)輸出最后一個(gè)列表元素。而且這種約定也適用于其他負(fù)數(shù)索引,比如索引-2返回倒數(shù)第二個(gè)列表元素,索引-3返回倒數(shù)第三個(gè)列表元素,以此類推?!纠?-5】列表的反向索引體系>>>list3[-1]#輸出列表最后一個(gè)元素使用索引-1ddd>>>list3[-2]ccc>>>list3[-3]bbb3.2.2列表的分片、修改與刪除1、列表的分片:在Python中處理列表的部分元素,稱之為分片。創(chuàng)建分片,可指定要使用的第一個(gè)元素和最后一個(gè)元素的索引。字符串、列表、元組都支持分片操作。分片的語法:[起始:結(jié)束:步長(zhǎng)]注意:選取的區(qū)間屬于左閉右開型,即從“起始”位開始,到“結(jié)束”位的前一位結(jié)束(不包含結(jié)束位本身)?!纠?-6】列表的分片>>>list3=['aaa','bbb','ccc','ddd']>>>list3[1:4]['bbb','ccc','ddd']>>>list1=[1,2,3,4,5,6]>>>list1[0:-1:1]#從位置0開始到結(jié)束-1,步長(zhǎng)1,不包含結(jié)束位置[1,2,3,4,5]>>>list1[:3]#省略起始位置的索引及步長(zhǎng),默認(rèn)起始位置從頭開始,默認(rèn)步長(zhǎng)為1,結(jié)束位置索引為3[1,2,3]>>>list1[0:5:3]#從第一個(gè)位置到第6個(gè)位置,每3個(gè)取一個(gè)值[1,4]3.2.2列表的分片、修改與刪除【例3-7】使用分片實(shí)現(xiàn)列表反轉(zhuǎn)list3=['aaa','bbb','ccc','ddd']>>>list3[::-1]['ddd','ccc','bbb','aaa']#使用逆序切片反轉(zhuǎn)列表>>>list3['aaa','bbb','ccc','ddd']#列表順序不變還可以使用reverse()方法反轉(zhuǎn)列表元素?!纠?-8】使用reverse()方法反轉(zhuǎn)列表>>>list3['aaa','bbb','ccc','ddd']>>>list3.reverse()#使用reverse()方法反轉(zhuǎn)列表>>>list3['ddd','ccc','bbb','aaa']]#列表順序永久改變方法reverse()是永久的反轉(zhuǎn)列表元素,但如果要恢復(fù)要原來的排列順序,則需要再次調(diào)用reverse()方法,而分片則是將列表反轉(zhuǎn)輸出,但列表順序不變。3.2.2列表的分片、修改與刪除2、應(yīng)用列表時(shí)可以在列表中添加新元素,列表添加元素的方法有3種。(1)使用append()方法在列表末尾添加元素?!纠?-9】使用append()方法添加元素>>>list3=['aaa','bbb','ccc','ddd']>>>list3['aaa','bbb','ccc','ddd']>>>list3.append('eee')#使用append()方法在列表末尾添加元素’eee’>>>list3['aaa','bbb','ccc','ddd','eee']這是最簡(jiǎn)單的更新列表方式,用append()方法將新元素‘eee’添加到列表末尾,而不影響列表中其它元素。3.2.2列表的分片、修改與刪除(2)使用insert()方法在列表任意位置插入元素?!纠?-10】使用insert()方法插入元素>>>list3=['aaa','bbb','ccc','ddd']>>>list3['aaa','bbb','ccc','ddd']>>>list3.insert(0,'zzz')#使用insert()方法在列表0號(hào)索引位置添加元素‘zzz’>>>list3['zzz','aaa','bbb','ccc','ddd']在這個(gè)例子中,值’zzz’被插入到了列表的開頭;方法insert()有兩個(gè)參數(shù),一個(gè)為你要插入位置的索引值,另一個(gè)是要插入元素的值。這種操作將列表中既有的每個(gè)元素都右移一個(gè)位置。append()方法只能在列表末尾插入元素,insert()方法可以列表中間任意位置插入元素。3.2.2列表的分片、修改與刪除(3)使用extend()方法批量添加元素在上面我們知道了怎么在列表中添加元素,同樣,使用extend()方法可以在列表中添加一個(gè)列表,達(dá)到批量添加元素的目的?!纠?-11】使用extend()方法批量添加元素>>>list3=['aaa','bbb','ccc','ddd']>>>list4=['eee','fff']>>>list3.extend(list4)#使用extend()方法批量添加元素>>>list3['aaa','bbb','ccc','ddd','eee','fff']3.2.2列表的分片、修改與刪除使用pop()方法刪除元素:使用pop()方法可以獲取列表中指定位置的元素,在獲取后,該元素會(huì)被自動(dòng)刪除,如果為pop()方法指定了索引,他會(huì)返回對(duì)應(yīng)索引置的元素;如果不指定位置,則默認(rèn)使用-1。因此,pop(0)將返回列表的頭元素,pop()或pop(-1)則會(huì)返回列表的尾元素?!纠?-14】使用pop()方法刪除列表元素>>>list3=['aaa','bbb','ccc','ddd']>>>list3['aaa','bbb','ccc','ddd']>>>x=list3.pop()#使用pop()方法刪除尾元素>>>x'ddd'#pop()方法默認(rèn)返回尾元素值>>>list3#列表尾元素被刪除['aaa','bbb','ccc']>>>list3=['aaa','bbb','ccc','ddd']>>>y=list3.pop(0)#使用pop(0)方法刪除頭元素>>>y'aaa'#pop(0)方法返回指定索引位置的元素值>>>list3['bbb','ccc','ddd']3.2.2列表的分片、修改與刪除(2)根據(jù)元素本身的值進(jìn)行刪除,可使用列表提供的remove()方法:有時(shí)候,我們不知道從列表中刪除值所在的位置,只知道要?jiǎng)h除元素的值,可使用方法remove()實(shí)現(xiàn)刪除該元素操作?!纠?-15】使用remove()方法刪除列表元素>>>list3=['aaa','bbb','ccc','ddd']>>>list3['aaa','bbb','ccc','ddd']>>>list3.remove('aaa')#使用remove(‘a(chǎn)aa’)方法刪除‘a(chǎn)aa’元素>>>list3['bbb','ccc','ddd']remove()方法只能刪除第一個(gè)指定的值。如果要?jiǎng)h除的值可能在列表中出現(xiàn)多次,就需要用循環(huán)來多次刪除所有這樣的值。3.2.2列表的分片、修改與刪除(3)將列表中所有元素全部刪除,可使用列表(list類型)提供的clear()方法,即清空列表?!纠?-16】使用clear()方法清空列表元素>>>list3=['aaa','bbb','ccc','ddd']>>>list3['aaa','bbb','ccc','ddd']>>>list3.clear()#使用clear()方法清空列表>>>list3[]3.2.3列表運(yùn)算1、比較運(yùn)算列表中有單個(gè)元素時(shí),直接比較相對(duì)應(yīng)的元素大小即可【例3-17】單元素列表比較>>>list1=[123]>>>list2=[456]>>>list1>list2#直接比較元素大小False如果列表中有多個(gè)元素:首先從列表中的第0個(gè)位置的元素相比較大小,如果哪個(gè)列表的第0個(gè)位置的元素大,就認(rèn)為該列表大,如果相等的話就一直比較下去,直到有一項(xiàng)大,就認(rèn)為該列表大?!纠?-18】多元素列表比較>>>list1=[123,456]>>>list2=[123,567]>>>list3=[123,456]>>>list1>list2False>>>list1==list3>>>True3.2.3列表運(yùn)算2、連接運(yùn)算【例3-19】使用“+”連接列表>>>list1=[123,456]>>>list2=[567,890]>>>list4=list1+list2>>>list4>>>[123,456,567,890]【例3-21】使用“+=”連接列表>>>list1=[123,456]>>>list2=[567,890]>>>list1+=list2#使用+=運(yùn)算符實(shí)現(xiàn)批量添加元素>>>list1[123,456,567,890]【例3-22】使用“*”用于重復(fù)列表中的元素。>>>list1=[123,456]>>>list1*3[123,456,123,456,123,456]3.2.4列表函數(shù)1、len(list):返回列表元素個(gè)數(shù),【例3-23】len()函數(shù)>>>list1=[123,456]>>>len(list1)2>>>len(['a','b','c'])32、max(list):返回列表元素最大值【例3-24】Max()函數(shù)>>>list1=[123,456]>>>max(list1)456>>>max([1,2,3,4,5])53.2.4列表函數(shù)3、min(list):返回列表元素最小值【例3-25】Min()函數(shù)>>>list1=[123,456]>>>min(list1)123>>>min([1,2,3,4,5])14、list(str):將字符串轉(zhuǎn)換為列表【例3-26】list()函數(shù)>>>list('Python')['P','y','t','h','o','n']5、使用sorted()函數(shù)對(duì)列表進(jìn)行排序【例3-27】sorted()函數(shù)>>>list1=[1,2,4,5,3]>>>print(sorted(list1))#使用sorted()函數(shù)對(duì)列表進(jìn)行排序,返回新列表[1,2,3,4,5]>>>list1#使用sorted()函數(shù)對(duì)列表排序,原列表值不變
[1,2,4,5,3]3.2.5列表方法1、使用sort()方法對(duì)列表排序列表被創(chuàng)建時(shí),里面的元素往往是亂的,沒有任何順序,當(dāng)需要以特定的順序呈現(xiàn)列表的元素時(shí),就需要對(duì)列表進(jìn)行排序處理?!纠?-28】使用sort()方法為列表排序>>>list4=['aaa','eee','ddd','ccc','bbb']>>>list4.sort()#使用sort()方法對(duì)字符串列表排序>>>list4['aaa','bbb','ccc','ddd','eee']sort()方法是按字母順序與數(shù)字順序?qū)α斜碓剡M(jìn)行排序,我們也可以按照與字母或者數(shù)字相反的順序排列元素,我們只需要向sort()方法傳遞參數(shù)reverse=True?!纠?-29】使用sort()方法為列表逆向排序7>>>list4=['aaa','eee','ddd','ccc','bbb']>>>list4.sort(reverse=True)#傳遞參數(shù)reverse=True實(shí)現(xiàn)列表逆序排序>>>list4['eee','ddd','ccc','bbb','aaa']3.2.5列表方法sort()和sorted()雖然相似,都可以實(shí)現(xiàn)排序功能,但是它們有很大的不同:(1)sort()是應(yīng)用在list上的方法,sorted()可以對(duì)所有可迭代的對(duì)象進(jìn)行排序操作。(2)list的sort()方法是對(duì)已經(jīng)存在的列表進(jìn)行操作,無返回值,而內(nèi)建函數(shù)sorted()方法返回的是一個(gè)新的list,而不是在原來的基礎(chǔ)上進(jìn)行的操作。3.2.5列表方法2、count()方法統(tǒng)計(jì)某個(gè)元素在列表中出現(xiàn)的次數(shù)【例3-30】使用count()方法統(tǒng)計(jì)列表中某元素個(gè)數(shù)>>>list3=['aaa','bbb','ccc','ddd',’aaa’]>>>list3.count('aaa')2>>>list3.count('eee')03、index()方法可以查詢?cè)氐奈恢谩纠?-31】使用index()方法查詢列表元素位置>>>list3=['aaa','bbb','ccc','ddd']>>>list3.index('ccc')24、copy()方法可以復(fù)制列表【例3-32】使用copy()方法復(fù)制列表>>>list3=['aaa','bbb','ccc','ddd']>>>list4=list3.copy()>>>list4['aaa','bbb','ccc','ddd']3.3元組(tuple)元組(tuple)是一組有序系列,包含0個(gè)或多個(gè)對(duì)象引用。Python3中元組采用圓括號(hào)中用逗號(hào)分隔的定義方式,圓括號(hào)可以省略?!纠?-33】使用圓括號(hào)定義元組>>>t0=()#定義空元組>>>t1=(1,)#定義單元素元素>>>t2=(1,2,3,4)>>>t3=1,2,3,4#圓括號(hào)可以省略>>>print(t0,t1,t2,t3)()(1,)(1,2,3,4)(1,2,3,4)當(dāng)你定義一個(gè)tuple時(shí),在定義的時(shí)候,tuple的元素就必須被確定下來,python在顯示只有1個(gè)元素的tuple時(shí),也會(huì)加一個(gè)逗號(hào),以免你誤解成數(shù)學(xué)計(jì)算意義上的括號(hào)。3.3.1元組與列表的異同Python的元組與列表類似,不同之處在于元組的元素不能修改。元組使用小括號(hào),列表使用方括號(hào)。元組是固定且不可改變的。一旦元組被創(chuàng)建,和列表不同,它的內(nèi)容無法被修改或它的大小也無法被改變?!纠?-34】使用圓括號(hào)定義元組>>>t=(1,2,3,4)>>>t[0]=5Traceback(mostrecentcalllast):File"<stdin>",line1,in<module>TypeError:'tuple'objectdoesnotsupportitemassignment雖然和列表類似,但是因?yàn)樵M創(chuàng)建后無法修改,所以元組沒有append(),insert()這樣的方法,所以相對(duì)來說元組的內(nèi)置函數(shù)就比較少。3.3.2元組的操作元組支持序列系列的基本操作,包括索引訪問、切片操作、連接操作,比較運(yùn)算操作,以及求元組長(zhǎng)度、最大值、最小值等。1、使用下標(biāo)索引訪問元組,與列表類似?!纠?-35】使用索引訪問元組元素>>>t1=(1,2,3,4,5,6)>>>t2=('aaa','bbb','ccc','ddd')>>>t1[2:5](3,4,5)>>>t2[0]'aaa'3.3.2元組的操作2、元組中的元素值是不允許修改的,但我們可以對(duì)元組進(jìn)行連接組合?!纠?-36】元組的連接組合>>>t1=(1,2,3,4,5,6)>>>t2=('aaa','bbb','ccc','ddd')>>>t3=t1+t2>>>t3(1,2,3,4,5,6,'aaa','bbb','ccc','ddd')3、計(jì)算元組的長(zhǎng)度?!纠?-37】使用len()函數(shù)計(jì)算元組長(zhǎng)度len(tuple)>>>t1=(1,2,3,4,5,6)>>>len(t1)63.3.2元組的操作4、返回元組中的最大值最小值?!纠?-38】使用max()、min()函數(shù)返回元組最大、最小值>>>t1=(1,2,3,4,5,6)>>>max(t1),min(t1)(6,1)5、將列表轉(zhuǎn)換為元組?!纠?-39】使用tuple()函數(shù)將列表轉(zhuǎn)換為元組tuple(seq)list1=[1,2,3,4,5,6]>>>t2=tuple(list1)>>>t2(1,2,3,4,5,6)3.4字符串(str)與字節(jié)串(bytes)字符串也是序列數(shù)據(jù)結(jié)構(gòu)的一種,與列表和元組一樣,其中的元素帶索引,索引從0開始,要訪問字符串的一部分,可以使用索引完成切片操作,字符串索引序號(hào)和列表一致。Python3訪問子字符串,可以使用方括號(hào)[]來截取字符串,字符串的截取的語法格式與元組相似:語法:變量[起始:結(jié)束:步長(zhǎng)]【例3-40】字符串的截取>>>str1="Python">>>str1[0]'P'>>>str1[1]'y'>>>str1[:3]'Pyt'>>>str1[3:6]'hon'3.4.2字符串的截取由于Python中不存在單獨(dú)的“字符”類型,對(duì)字符串做索引操作將產(chǎn)生一個(gè)長(zhǎng)度為1的字符串。也就是說,對(duì)于一個(gè)非空字符串s,s[0]==s[0:1]?!纠?-41】單元素字符串>>>str1="Python">>>str1[0]'P'>>>str1[0:1]'P'>>>str1[0]==str1[0:1]True3.4.3字符串方法Python3.x全面支持中文,中文和英文字母都作為一個(gè)字符對(duì)待,甚至可以使用中文作為變量名。除了支持使用加號(hào)運(yùn)算符連接字符串以外,Python字符串還提供了大量的方法支持格式化、查找、替換、排版等操作?!纠?-42】字符串常用方法>>>str2='hello'>>>str2.capitalize()#首字母大寫'Hello'>>>'好好學(xué)習(xí)'.center(30,'*')#指定寬度并居中'*************好好學(xué)習(xí)*************'>>>'123'.zfill(30)#指定寬度并填充0'000000000000000000000000000123'>>>str3='好好學(xué)習(xí)天天向上'>>>str3.index('學(xué)')#返回指定字符元素索引2>>>str3.count('好')#統(tǒng)計(jì)指定字符元素個(gè)數(shù)2>>>3.4.4.字節(jié)串(bytes)字節(jié)串是字節(jié)序列,它可以直接存儲(chǔ)在硬盤,給計(jì)算機(jī)傳輸或者保存,字節(jié)串和字符串有本質(zhì)的區(qū)別,字符串是字符序列,它是一種抽象的概念,不能直接存儲(chǔ)或傳輸,僅供人類交流使用,字節(jié)串可以看成是計(jì)算機(jī)設(shè)備之間的交流編碼。字符串與字節(jié)串之間的映射被稱為編碼/解碼,對(duì)str類型的字符串調(diào)用其encode()方法進(jìn)行編碼得到bytes字節(jié)串,對(duì)bytes字節(jié)串調(diào)用其decode()方法并指定正確的編碼格式則得到str字符串?!纠?-43】字符串與字節(jié)串的編碼與解碼>>>x='大學(xué)'#字符串>>>type(x)#默認(rèn)字符串類型為str<class'str'>>>>x.encode()#默認(rèn)使用utf8編碼格式進(jìn)行編碼b'\xe5\xa4\xa7\xe5\xad\xa6'>>>type(x.encode())#數(shù)據(jù)類型<class'bytes'>#字節(jié)串3.4.4.字節(jié)串(bytes)>>>type('Helloworld')#默認(rèn)字符串類型為str<class'str'>>>>type(b'Helloworld')#在定界符前加上字母b表示字節(jié)串<class'bytes'>>>>'Helloworld'.encode('utf8')#使用utf8編碼格式進(jìn)行編碼b'Helloworld'>>>>>>'理工大學(xué)'.encode('utf8')#對(duì)中文進(jìn)行編碼b'\xe7\x90\x86\xe5\xb7\xa5\xe5\xa4\xa7\xe5\xad\xa6'>>>b'\xe7\x90\x86\xe5\xb7\xa5\xe5\xa4\xa7\xe5\xad\xa6'.decode()'理工大學(xué)'>>>'理工大學(xué)'.encode('gbk')b'\xc0\xed\xb9\xa4\xb4\xf3\xd1\xa7'>>>b'\xc0\xed\xb9\xa4\xb4\xf3\xd1\xa7.decode('gbk')#對(duì)bytes字節(jié)串進(jìn)行解碼'理工大學(xué)'3.5字典(dict)字典是另一種可變?nèi)萜髂P停铱纱鎯?chǔ)任意類型對(duì)象。字典的每個(gè)鍵值(key=>value)對(duì)用冒號(hào)(:)分割,每個(gè)對(duì)之間用逗號(hào)(,)分割,整個(gè)字典包括在花括號(hào)({})中,字典的值可以取任何數(shù)據(jù)類型,但鍵必須是不可變的,如字符串,數(shù)字或元組(列表這樣的可變類型不能作為鍵)。字典根據(jù)鍵可以查詢到值。在Python中,字典是一組鍵/值對(duì)的數(shù)據(jù)結(jié)構(gòu)。每個(gè)鍵都與一個(gè)值相關(guān)聯(lián),我們可以使用鍵來訪問與之相關(guān)聯(lián)的值。但是鍵與鍵之間不能重復(fù)。與鍵相關(guān)聯(lián)的值可以是數(shù)字、字符串、列表或任何Python對(duì)象。在Python中,字典用放在花括號(hào){}中的一系列鍵\值對(duì)表示:student={'name':'zhangsan','age':20}鍵/值對(duì)是兩個(gè)相關(guān)聯(lián)的值。指定鍵時(shí),Python將返回與之相關(guān)聯(lián)的值。鍵和值之間用冒號(hào)分隔,而鍵\值對(duì)之間用逗號(hào)分隔。在字典中,我們想存儲(chǔ)多少個(gè)鍵/值對(duì)都可以。字典定義形式如下:{鍵1:值1,[鍵2:值2,……鍵n:值n]}3.5.1創(chuàng)建字典字典也可以通過創(chuàng)建dict對(duì)象來創(chuàng)建。其基本形式如下:dict()#創(chuàng)建一個(gè)空字典dict(**kwargs)#使用關(guān)鍵字參數(shù),創(chuàng)建一個(gè)新字典dict(mapping)#從一個(gè)字典對(duì)象創(chuàng)建一個(gè)新字典dict(iterable)#使用可迭代對(duì)象創(chuàng)建一個(gè)新字典【例3-44】創(chuàng)建新字典>>>dict0={}#使用花括號(hào)創(chuàng)建一個(gè)空字典>>>dict0{}dict1={'one':1,'two':2,'three':3}#使用花括號(hào)鍵/值創(chuàng)建字典>>>dict1{'one':1,'two':2,'three':3}>>>dictstu=dict(name='張三',age=20)#使用關(guān)鍵字參數(shù),創(chuàng)建字典>>>dictstu{'name':'張三','age':20}3.5.1創(chuàng)建字典>>>dict2=dict({'Mar':'三月','Jan':'一月','Feb':'二月'})#從一個(gè)字典對(duì)象創(chuàng)建一個(gè)新字典>>>dict2{'Mar':'三月','Jan':'一月','Feb':'二月'}>>>dict3=dict([('Feb','二月'),('Jan','一月'),('Mar','三月')])>>>dict3{'Feb':'二月','Jan':'一月','Mar':'三月'}#使用可迭代對(duì)象創(chuàng)建一個(gè)新字典>>>dict3==dict2#dict3和dict2數(shù)據(jù)項(xiàng)順序并不一樣,但是并不影響它們對(duì)比。True3.5.2字典操作為了避免上述異常,在訪問字典的時(shí)候,首先需要檢查某個(gè)鍵是否存在于字典中時(shí),可以使用get()方法,還可以設(shè)置默認(rèn)值:【例3-46】使用get()方法檢查字典中是否存在元素,若無該元素默認(rèn)返回None>>>dict1={'one':1,'two':2,'three':3}>>>dict1.get('four')#使用get()方法檢查元素是否存在>>>print(dict1.get('four'))None>>>dict1={'one':1,'two':2,'three':3}>>>dict1.get('two')#當(dāng)要找的鍵存在時(shí),get()方法可以返回字典元素值23.5.2字典操作2、更新字典中的元素:字典是可變對(duì)象,支持對(duì)元素的更新操作,在字典中添加新元素時(shí),如果要添加的鍵已經(jīng)存在,那么字典中該鍵對(duì)應(yīng)的值會(huì)被新值替代?!纠?-47】更新字典中的元素>>>dict3={'一月':'Jan','二月':'Feb','三月':'Mar'}>>>dict3['三月']='March'#更新字典元素值>>>dict3{'一月':'Jan','二月':'Feb','三月':'March'}>>>dict3['四月']='April'#往字典中添加新元素>>>dict3{'一月':'Jan','二月':'Feb','三月':'March','四月':'April'}>>>3.5.2字典操作3、刪除字典和字典元素:對(duì)字典執(zhí)行刪除操作,可是使用del命令實(shí)現(xiàn),del命令既能刪除字典元素,又能刪除整個(gè)字典?!纠?-48】字典的刪除操作>>>dict3{'一月':'Jan','二月':'Feb','三月':'March','四月':'April'}>>>deldict3['四月']>>>dict3{'一月':'Jan','二月':'Feb','三月':'March'}>>>>>>deldict3#刪除整個(gè)字典>>>dict3#報(bào)錯(cuò)提示字典dict3不存在Traceback(mostrecentcalllast):File"<pyshell#99>",line1,in<module>dict33.5.2字典操作使用del命令刪除整個(gè)字典后,字典所在內(nèi)存會(huì)被釋放,如果再訪問字典dict3,會(huì)報(bào)錯(cuò)提示字典dict3不存在。刪除整個(gè)字典的操作須謹(jǐn)慎使用。如果想要保留字典占用內(nèi)存空間,可以使用clear()方法清除所有元素,得到一個(gè)空的字典?!纠?-48】字典的清空操作>>>dict3={'二月':'Feb','一月':'Jan','三月':'Mar'}>>>dict3.clear()>>>dict3{}>>>3.5.3字典方法字典的常用內(nèi)建方法方法名相關(guān)描述clear()刪除字典中的所有元素copy()返回字典的一個(gè)淺復(fù)制fromkeys(seq[,value])創(chuàng)建一個(gè)新的字典,設(shè)置seq中的元素為字典的鍵,設(shè)置value為字典中所有鍵對(duì)應(yīng)的初始值。如果不提供此值,則默認(rèn)為Noneget(key[,default])通過字典中的鍵,獲取其對(duì)應(yīng)的值。如果字典中不存在此鍵,則返回default的值。注意,default的默認(rèn)值為Noneitems()返回字典的元素視圖pop(key[,default])如果字典中的鍵存在,刪除并返回其對(duì)應(yīng)的值;如果字典中的鍵不存在,且沒有給出default的值,則會(huì)引發(fā)KeyError異常popitem()隨機(jī)刪除字典中的一個(gè)鍵值對(duì),并返回這個(gè)鍵/值對(duì)setdefault(key[,default])如果字典中不存在key,則會(huì)使用dictkey)=default為它賦值update([other])把other中的鍵值對(duì)添加到字典中values()返回字典的值視圖3.5.3字典方法1、copy()方法:用于返回一個(gè)有著相同鍵值對(duì)的字典。【例3-49】使用copy()方法實(shí)現(xiàn)字典的復(fù)制>>>dict1={'one':1,'two':2,'three':3}>>>dictcpy=dict1.copy()>>>dictcpy{'one':1,'two':2,'three':3}2、items()方法:用于返回字典的元素視圖。元素視圖會(huì)一直與字典保持同步,當(dāng)字典發(fā)生變化時(shí),可以實(shí)時(shí)地反映出字典中元素的變化。【例3-50】使用items()方法返回字典元素視圖>>>dict1={'one':1,'two':2,'three':3}>>>dict1.items()dict_items([('one',1),('two',2),('three',3)])>>>3.5.3字典方法3、keys()方法:用于返回字典的鍵視圖,該視圖會(huì)一直與字典保持同步,當(dāng)字典發(fā)生變化時(shí),可以實(shí)時(shí)地反映出字典中鍵的變化?!纠?-51】使用keys()方法返回字典鍵視圖>>>dict1={'one':1,'two':2,'three':3}>>>dict1.keys()dict_keys(['one','two','three'])>>>4、values()方法:用于返回字典的值視圖,該視圖會(huì)一直與字典保持同步,當(dāng)字典發(fā)生變化時(shí),可以實(shí)時(shí)地反映出字典中值的變化?!纠?-52】使用values()方法返回字典值視圖>>>dict1={'one':1,'two':2,'three':3}>>>dict1.values()dict_values([1,2,3])>>>3.6集合(set)集合就像舍棄了值,僅剩下鍵的字典一樣,鍵與鍵之間也不允許重復(fù)。如果僅僅想知道一個(gè)元素是否存在而不關(guān)心其他的,使用集合是個(gè)非常好的選擇。集合特性是:大括號(hào)組織起來,元素唯一,元素?zé)o序。Python3有兩種內(nèi)置的集合類型:set(可變集合)和frozenset(不可變集合),它們的區(qū)別如下:1、set集合可變的集合類型,能夠?qū)系脑剡M(jìn)行更改。由于set集合是可變的,所以它沒有哈希值,不能用作字典的鍵或作為另一個(gè)集合的元素。2、frozenset集合不可變集合類型,集合的內(nèi)容在創(chuàng)建以后不能被更改,所以它可以用作字典的鍵,或者作為另一個(gè)集合的元素。Python3中提供了set()函數(shù)用于創(chuàng)建可變集合對(duì)象,frozenset()函數(shù)用于創(chuàng)建不可變集合的對(duì)象。3.6集合(set)這兩個(gè)函數(shù)語法格式如下:set([iterable])frozenset([iterable])【例3-53】創(chuàng)建集合>>>set1=set(‘Python’)#通過set()函數(shù)創(chuàng)建字符型集合>>>set2={1,2,3,4,5,6}#通過普通方法創(chuàng)建集合>>>fset1=frozenset([1,2,3,4,5,6])#通過frozenset()函數(shù)創(chuàng)建集合>>>set1{'o','n','y','t','P','h'}#集合元素?zé)o順序>>>set2{1,2,3,4,5,6}>>>fset1frozenset({1,2,3,4,5,6})3.6.2集合的操作(可變集合)3、刪除集合元素:可以通過調(diào)用remove()、discard()、pop()或clear()4種方法實(shí)現(xiàn),其中remove()和discard()方法用于刪除指定元素,pop()方法用于刪除第一個(gè)元素,而clear()方法用于刪除集合所有元素。例如【例3-57】刪除集合元素>>>set1={'one',2,3,4,'five',6}>>>set1.remove('five')#使用remove()方法刪除元素>>>set1{'one',2,3,4,6}>>>set1{'one',2,3,4,6}>>>element=set1.pop()#使用pop()方法隨機(jī)刪除一個(gè)元素并返回>>>element'one'>>>set1{2,3,4,6}>>>3.6.3集合的運(yùn)算除了常用的基本操作之外,集合還可以使用集合運(yùn)算符進(jìn)行操作處理,Python3中的集合支持使用標(biāo)準(zhǔn)類型的操作符,包括成員操作符(in或notin)、等價(jià)操作符(==或!=)和比較運(yùn)算符(>、<、>=、<=)下面對(duì)它們進(jìn)行介紹1、成員操作符與其它類型一樣,in或notin操作符用于判斷某個(gè)值是或者不是集合的元素?!纠?-59】集合的成員操作符>>>set1={1,2,3,4,5,6}>>>9inset1#判斷集合中是否有某個(gè)元素False>>>3inset1True>>>'one'notinset1#判斷某個(gè)元素不是集合成員True>>>3.6.3集合的運(yùn)算2、等價(jià)操作符==和!=操作符用于比較兩個(gè)相同或者不同的集合。等價(jià)是指一個(gè)集合的每個(gè)元素同時(shí)又是另外一個(gè)集合中的元素,這種比較跟集合的類型和元素順序無關(guān),只是與集合的元素有關(guān)。【例3-60】集合的等價(jià)操作符>>>set2=set('Java')>>>set3=set('Python')>>>set2!=set3#!=操作符判斷兩個(gè)集合不同True>>>set2=set('who')>>>set3=set('how')>>>set2==set3#==操作符判斷連個(gè)集合相同True#兩個(gè)集合相同與元素順序無關(guān)3.6.3集合的運(yùn)算3、比較運(yùn)算符操作符實(shí)例說明<
A<B如果集合A是集合B的真子集返回True,反之返回False<=A<=B如果集合A是集合B的子集返回True,反之返回False>
A>B如果集合A是集合B的真超集返回True,反之返回False>=A>=B如果集合A是集合B的真超集返回True,反之返回False3.6.3集合的運(yùn)算3、比較運(yùn)算符【例3-61】集合的比較運(yùn)算符>>>set2=set('Python')>>>set3=set('PythonandJava')>>>set2{'o','n','y','t','P','h'}>>>set3{'o','n','d','v','y','a','J','t','P','','h'}>>>set2<set3True>>>set3>=set2True3.6.3集合的運(yùn)算3、集合類型操作符Python3中集合之間支持聯(lián)合(|)、交集(&)差補(bǔ)(-)和對(duì)稱差分(^)的操作。操作符實(shí)例說明|A|B計(jì)算集合A與集合B進(jìn)行并集&A&B計(jì)算集合A與集合B進(jìn)行交集-A-B計(jì)算集合A與集合B進(jìn)行差集^A^B計(jì)算集合A與集合B進(jìn)行計(jì)算對(duì)稱差分3.6.3集合的運(yùn)算3、集合類型操作符(1)聯(lián)合(|)聯(lián)合類似于數(shù)學(xué)集合中的并集操作,把所有屬于集合A或集合B的元素組成一個(gè)新的集合,這個(gè)新集合的每個(gè)元素至少是A或B的元素?!纠?-62】集合的聯(lián)合運(yùn)算>>>set1={1,2,3,4,5,6}>>>set2=set('Python')>>>set1|set2#set1與set2聯(lián)合運(yùn)算合并兩個(gè)集合{1,2,3,4,5,6,'o','n','y','t','P','h'}3.6.3集合的運(yùn)算3、集合類型操作符(2)交集(&)交集就是把屬于集合A且屬于集合B的元素組成一個(gè)新集合,這個(gè)新集合的每個(gè)元素同時(shí)就是A和B兩個(gè)集合的元素?!纠?-63】集合的交集運(yùn)算>>>set2=set('Python')>>>set3=set('PythonandJava')>>>set2&set3{'o','n','y','P','t','h'}>>>3.6.3集合的運(yùn)算3、集合類型操作符(3)差集(-)差集就是指新集合中的元素值屬于集合A或集合B?!纠?-64】集合的差集運(yùn)算>>>set1={1,2,3,4,5,6}>>>set3={2,3,4,5,6,7}>>>set1-set3{1}>>>set3-set1{7}3.6.3集合的運(yùn)算3、集合類型操作符(4)對(duì)稱差分(^)對(duì)稱差分是指只把屬于集合A或者集合B且不能同時(shí)屬于兩個(gè)集合的元素組成一個(gè)新集合,這個(gè)新集合的每個(gè)元素只能是A或B中的元素。【例3-65】集合的對(duì)稱差分>>>set1={1,2,3,4,5,6}>>>set3={2,3,4,5,6,7}>>>set1^set3{1,7}>>>3.6.4集合的方法Python為集合提供了一些非常實(shí)用的內(nèi)建方法,可以使用這些方法來簡(jiǎn)化開發(fā)步驟方法名相關(guān)描述union()返回兩個(gè)集合的并集update()給集合添加元素intersection()返回集合的交集intersection_update()返回集合的交集。difference()返回多個(gè)集合的差集difference_update()移除集合中的元素,該元素在指定的集合也存在。symmetric_difference()返回兩個(gè)集合中不重復(fù)的元素集合。symmetric_difference_update()移除當(dāng)前集合中在另外一個(gè)指定集合相同的元素,并將另外一個(gè)指定集合中不同的元素插入到當(dāng)前集合中。isdisjoint()判斷兩個(gè)集合是否包含相同的元素,如果沒有返回True,否則返回False。issubset()判斷指定集合是否為該方法參數(shù)集合的子集。issuperset()判斷該方法的參數(shù)集合是否為指定集合的子集add()為集合添加元素clear()移除集合中的所有元素copy()拷貝一個(gè)集合discard()刪除集合中指定的元素pop()隨機(jī)移除元素remove()移除指定元素3.6.4集合的方法1、union()方法相當(dāng)于并集?!纠?-66】使用union()方法實(shí)現(xiàn)并集>>>set1={1,2,3,4,5,6}>>>set2=set('Python')>>>set1.union(set2)#使用方法union()合并集合set2{1,2,3,4,5,6,'o','n','y','t','P','h'}>>>set1#set1集合元素未改變{1,2,3,4,5,6}3.6.4集合的方法2、update()方法相當(dāng)于并集,并更新集合?!纠?-67】使用update()方法實(shí)現(xiàn)并集>>>set1={1,2,3,4,5,6}>>>set2=set('Python')>>>set1.update(set2)#使用方法update()添加集合set2>>>set1#set1集合元素改變{1,2,3,4,5,6,'o','n','y','t','P','h'}3.6.4集合的方法3、intersection()方法相當(dāng)于交集?!纠?-68】使用intersection()方法實(shí)現(xiàn)交集運(yùn)算>>>set2=set('Python')>>>set3=set('PythonandJava')>>>ersection(set2){'o','n','y','P','t','h'}>>>set3#set3集合元素未改變{'o','n','d','v','y','a','J','t','P','','h'}3.6.4集合的方法4、intersection_update()方法相當(dāng)于交集,并更新集合?!纠?-69】使用intersection_update()方法實(shí)現(xiàn)交集運(yùn)算,并更新集合>>>set2=set('Python')>>>set3=set('PythonandJava')>>>ersection_update(set2)>>>set3#set3集合元素改變{'o','n','y','P','t','h'}>>>3.6.4集合的方法5、difference()方法相當(dāng)于差集?!纠?-70】使用difference()方法實(shí)現(xiàn)差集>>>set1={1,2,3,4,5,6}>>>set3={2,3,4,5,6,7}>>>set1.difference(set3)#實(shí)現(xiàn)set1-set3差集{1}>>>set3.difference(set1)#實(shí)現(xiàn)set3-set1差集{7}>>>set1{1,2,3,4,5,6}#set1集合元素未改變>>>set3{2,3,4,5,6,7}#set3集合元素未改變>>>3.6.4集合的方法6、difference_update()方法相當(dāng)于差集,并更新集合?!纠?-71】使用difference_update()方法實(shí)現(xiàn)差集并更新集合>>>set1={1,2,3,4,5,6}>>>set3={2,3,4,5,6,7}>>>set1.difference_update(set3)#實(shí)現(xiàn)set1-set3差集>>>set1#set1集合元素改變{1}7、symmetric_difference()方法相當(dāng)于對(duì)稱差分?!纠?-72】使
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年公司稅務(wù)籌劃管理工作計(jì)劃
- 選煤廠工藝崗位技術(shù)操作規(guī)程考試試題及答案
- 2026年公司后備干部選拔培養(yǎng)計(jì)劃
- 企業(yè)間誠(chéng)信協(xié)作共進(jìn)承諾書8篇
- 中級(jí)銑工測(cè)試試題及答案
- 微生物與臨床試題及答案
- 那一天我真快樂我的情感記錄與表達(dá)作文10篇
- 2025年上海浦東英語教編筆試及答案
- 2025年密云區(qū)筆試試卷答案
- 2025年面試醫(yī)院行政崗筆試題目及答案
- 雷波縣糧油貿(mào)易總公司 2026年面向社會(huì)公開招聘?jìng)淇伎荚囋囶}及答案解析
- 療養(yǎng)院?jiǎn)T工勞動(dòng)保護(hù)制度
- 2026浙江溫州市蒼南縣城市投資集團(tuán)有限公司招聘19人考試參考試題及答案解析
- 2026年廣州中考化學(xué)創(chuàng)新題型特訓(xùn)試卷(附答案可下載)
- 2025司法鑒定人資格考試考點(diǎn)試題及答案
- 保健用品生產(chǎn)管理制度
- 檔案計(jì)件工資管理制度
- 浙江省杭州市拱墅區(qū)2024-2025學(xué)年八年級(jí)上學(xué)期語文期末試卷(含答案)
- DB11∕T 695-2025 建筑工程資料管理規(guī)程
- 產(chǎn)科護(hù)理中的人文關(guān)懷與溝通藝術(shù)
- 2025年內(nèi)蒙古行政執(zhí)法考試試題及答案
評(píng)論
0/150
提交評(píng)論