人工智能技術(shù)基礎(chǔ) 課件 模塊4 Python序列_第1頁(yè)
人工智能技術(shù)基礎(chǔ) 課件 模塊4 Python序列_第2頁(yè)
人工智能技術(shù)基礎(chǔ) 課件 模塊4 Python序列_第3頁(yè)
人工智能技術(shù)基礎(chǔ) 課件 模塊4 Python序列_第4頁(yè)
人工智能技術(shù)基礎(chǔ) 課件 模塊4 Python序列_第5頁(yè)
已閱讀5頁(yè),還剩88頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

Python序列概述Python序列類(lèi)似于其他語(yǔ)言中的數(shù)組,但功能要強(qiáng)大很多。Python中常用的序列結(jié)構(gòu)有列表、元組、字符串,字典、集合以及range等對(duì)象也支持很多類(lèi)似的操作。列表、元組、字符串支持雙向索引,第一個(gè)元素下標(biāo)為0,第二個(gè)元素下標(biāo)為1,以此類(lèi)推;最后一個(gè)元素下標(biāo)為-1,倒數(shù)第二個(gè)元素下標(biāo)為-2,以此類(lèi)推。有序序列無(wú)序序列列表元組字符串字典集合range、zip、map、enumerate等可變序列不可變序列Python序列概述

列表元組字典集合類(lèi)型名稱(chēng)listtupledictset定界符方括號(hào)[]圓括號(hào)()大括號(hào){}大括號(hào){}是否可變是否是是是否有序是是否否是否支持下標(biāo)是(使用序號(hào)作為下標(biāo))是(使用序號(hào)作為下標(biāo))是(使用“鍵”作為下標(biāo))否元素分隔符逗號(hào)逗號(hào)逗號(hào)逗號(hào)對(duì)元素形式的要求無(wú)無(wú)鍵:值必須可哈希對(duì)元素值的要求無(wú)無(wú)“鍵”必須可哈希必須可哈希元素是否可重復(fù)是是“鍵”不允許重復(fù),“值”可以重復(fù)否元素查找速度非常慢很慢非??旆浅?煨略龊蛣h除元素速度尾部操作快其他位置慢不允許快快Python序列概述4.1

列表列表是Python中內(nèi)置有序、可變序列,列表的所有元素放在一對(duì)中括號(hào)“[]”中,并使用逗號(hào)分隔開(kāi);當(dāng)列表元素增加或刪除時(shí),列表對(duì)象自動(dòng)進(jìn)行擴(kuò)展或收縮內(nèi)存,保證元素之間沒(méi)有縫隙;在Python中,一個(gè)列表中的數(shù)據(jù)類(lèi)型可以各不相同,可以同時(shí)分別為整數(shù)、實(shí)數(shù)、字符串等基本類(lèi)型,甚至是列表、元組、字典、集合以及其他自定義類(lèi)型的對(duì)象。[10,20,30,40]['crunchyfrog','rambladder','larkvomit']['spam',2.0,5,[10,20]][['file1',200,7],['file2',260,9]]列表常用方法4.1

列表方法說(shuō)明lst.append(x)將元素x添加至列表lst尾部lst.extend(L)將列表L中所有元素添加至列表lst尾部lst.insert(index,x)在列表lst指定位置index處添加元素x,該位置后面的所有元素后移一個(gè)位置lst.remove(x)在列表lst中刪除首次出現(xiàn)的指定元素,該元素之后的所有元素前移一個(gè)位置lst.pop([index])刪除并返回列表lst中下標(biāo)為index(默認(rèn)為-1)的元素lst.clear()刪除列表lst中所有元素,但保留列表對(duì)象lst.index(x)返回列表lst中第一個(gè)值為x的元素的下標(biāo),若不存在值為x的元素則拋出異常lst.count(x)返回指定元素x在列表lst中的出現(xiàn)次數(shù)lst.reverse()對(duì)列表lst所有元素進(jìn)行逆序lst.sort(key=None,reverse=False)對(duì)列表lst中的元素進(jìn)行排序,key用來(lái)指定排序依據(jù),reverse決定升序(False)還是降序(True)lst.copy()返回列表lst的淺復(fù)制4.1.1列表創(chuàng)建與刪除使用“=”直接將一個(gè)列表賦值給變量即可創(chuàng)建列表對(duì)象>>>a_list=['a','b','mpilgrim','z','example']>>>a_list=[]#創(chuàng)建空列表也可以使用list()函數(shù)將元組、range對(duì)象、字符串或其他類(lèi)型的可迭代對(duì)象類(lèi)型的數(shù)據(jù)轉(zhuǎn)換為列表。>>>a_list=list((3,5,7,9,11))>>>a_list[3,5,7,9,11]>>>list(range(1,10,2))[1,3,5,7,9]>>>list('helloworld')['h','e','l','l','o','','w','o','r','l','d']>>>x=list()#創(chuàng)建空列表4.1.1列表創(chuàng)建與刪除當(dāng)不再使用時(shí),使用del命令刪除整個(gè)列表,如果列表對(duì)象所指向的值不再有其他對(duì)象指向,Python將同時(shí)刪除該值。>>>dela_list>>>a_listTraceback(mostrecentcalllast):File"<pyshell#6>",line1,in<module>a_listNameError:name'a_list'isnotdefined4.1.2列表元素的增加(1)可以使用“+”運(yùn)算符將元素添加到列表中。>>>aList=[3,4,5]>>>aList=aList+[7]>>>aList[3,4,5,7]嚴(yán)格意義上來(lái)講,這并不是真的為列表添加元素,而是創(chuàng)建了一個(gè)新列表,并將原列表中的元素和新元素依次復(fù)制到新列表的內(nèi)存空間。由于涉及大量元素的復(fù)制,該操作速度較慢,在涉及大量元素添加時(shí)不建議使用該方法。4.1.2列表元素的增加(2)使用列表對(duì)象的append()方法在當(dāng)前列表尾部追加元素,原地修改列表,是真正意義上的在列表尾部添加元素,速度較快。>>>aList.append(9)>>>aList[3,4,5,7,9]所謂“原地”,是指不改變列表在內(nèi)存中的首地址。4.1.2列表元素的增加Python采用的是基于值的自動(dòng)內(nèi)存管理方式,當(dāng)為對(duì)象修改值時(shí),并不是真的直接修改變量的值,而是使變量指向新的值,這對(duì)于Python所有類(lèi)型的變量都是一樣的。>>>a=[1,2,3]>>>id(a)#返回對(duì)象的內(nèi)存地址20230752>>>a=[1,2]>>>id(a)203382084.1.2列表元素的增加列表中包含的是元素值的引用,而不是直接包含元素值。如果是直接修改序列變量的值,則與Python普通變量的情況是一樣的如果是通過(guò)下標(biāo)來(lái)修改序列中元素的值或通過(guò)可變序列對(duì)象自身提供的方法來(lái)增加和刪除元素時(shí),序列對(duì)象在內(nèi)存中的起始地址是不變的,僅僅是被改變值的元素地址發(fā)生變化,也就是所謂的“原地操作”。4.1.2列表元素的增加>>>a=[1,2,4]>>>b=[1,2,3]>>>a==bFalse>>>id(a)==id(b)False>>>id(a[0])==id(b[0])True>>>a=[1,2,3]>>>id(a)25289752>>>a.append(4)>>>id(a)25289752>>>a.remove(3)>>>a[1,2,4]>>>id(a)25289752>>>a[0]=5>>>a[5,2,4]>>>id(a)252897524.1.2列表元素的增加(3)使用列表對(duì)象的extend()方法可以將另一個(gè)迭代對(duì)象的所有元素添加至該列表對(duì)象尾部。通過(guò)extend()方法來(lái)增加列表元素也不改變其內(nèi)存首地址,屬于原地操作。>>>a.extend([7,8,9])>>>a[5,2,4,7,8,9]>>>id(a)25289752>>>aList.extend([11,13])>>>aList[3,4,5,7,9,11,13]>>>aList.extend((15,17))>>>aList[3,4,5,7,9,11,13,15,17]4.1.2列表元素的增加(4)使用列表對(duì)象的insert()方法將元素添加至列表的指定位置。>>>aList.insert(3,6)#在下標(biāo)為3的位置插入元素6>>>aList[3,4,5,6,7,9,11,13,15,17]4.1.2列表元素的增加應(yīng)盡量從列表尾部進(jìn)行元素的增加與刪除操作。列表的insert()可以在列表的任意位置插入元素,但由于列表的自動(dòng)內(nèi)存管理功能,insert()方法會(huì)引起插入位置之后所有元素的移動(dòng),這會(huì)影響處理速度。類(lèi)似的還有后面介紹的remove()方法以及使用pop()函數(shù)彈出列表非尾部元素和使用del命令刪除列表非尾部元素的情況。4.1.2列表元素的增加importtimedefInsert():a=[]foriinrange(10000):a.insert(0,i)defAppend():a=[]foriinrange(10000):a.append(i)start=time.time()foriinrange(10):Insert()print('Insert:',time.time()-start)start=time.time()foriinrange(10):Append()print('Append:',time.time()-start)左側(cè)代碼運(yùn)行結(jié)果如下:Insert:0.578000068665Append:0.03099989891054.1.2列表元素的增加(5)使用乘法來(lái)擴(kuò)展列表對(duì)象,將列表與整數(shù)相乘,生成一個(gè)新列表,新列表是原列表中元素的重復(fù)。>>>aList=[3,5,7]>>>bList=aList>>>id(aList)57091464>>>id(bList)57091464>>>aList=aList*3>>>aList[3,5,7,3,5,7,3,5,7]>>>bList[3,5,7]>>>id(aList)57092680>>>id(bList)570914644.1.2列表元素的增加當(dāng)使用*運(yùn)算符將包含列表的列表重復(fù)并創(chuàng)建新列表時(shí),并不是復(fù)制子列表值,而是復(fù)制已有元素的引用。因此,當(dāng)修改其中一個(gè)值時(shí),相應(yīng)的引用也會(huì)被修改。>>>x=[[None]*2]*3>>>x[[None,None],[None,None],[None,None]]>>>x[0][0]=5>>>x[[5,None],[5,None],[5,None]]>>>x=[[1,2,3]]*3>>>x[0][0]=10>>>x[[10,2,3],[10,2,3],[10,2,3]]4.1.3列表元素的刪除(1)使用del命令刪除列表中的指定位置上的元素。>>>a_list=[3,5,7,9,11]>>>dela_list[1]>>>a_list[3,7,9,11]4.1.3列表元素的刪除(2)使用列表的pop()方法刪除并返回指定位置(默認(rèn)為最后一個(gè))上的元素,如果給定的索引超出了列表的范圍則拋出異常。>>>a_list=list((3,5,7,9,11))>>>a_list.pop()11>>>a_list[3,5,7,9]>>>a_list.pop(1)5>>>a_list[3,7,9]4.1.3列表元素的刪除(3)使用列表對(duì)象的remove()方法刪除首次出現(xiàn)的指定元素,如果列表中不存在要?jiǎng)h除的元素,則拋出異常。>>>a_list=[3,5,7,9,7,11]>>>a_list.remove(7)>>>a_list[3,5,9,7,11]4.1.3列表元素的刪除代碼編寫(xiě)好后必須要經(jīng)過(guò)反復(fù)測(cè)試,不能滿(mǎn)足于幾次測(cè)試結(jié)果正確。例如,下面的代碼成功地刪除了列表中的重復(fù)元素,執(zhí)行結(jié)果是完全正確的。>>>x=[1,2,1,2,1,2,1,2,1]>>>foriinx:

ifi==1:

x.remove(i) >>>x[2,2,2,2]4.1.3列表元素的刪除然而,上面這段代碼的邏輯是錯(cuò)誤的。同樣的代碼,僅僅是所處理的數(shù)據(jù)發(fā)生了一點(diǎn)變化,然而當(dāng)循環(huán)結(jié)束后卻發(fā)現(xiàn)并沒(méi)有把所有的“1”都刪除,只是刪除了一部分。>>>x=[1,2,1,2,1,1,1]>>>foriinx:ifi==1: x.remove(i) >>>x[2,2,1]4.1.3列表元素的刪除兩組數(shù)據(jù)的本質(zhì)區(qū)別在于,第一組數(shù)據(jù)中沒(méi)有連續(xù)的“1”,而第二組數(shù)據(jù)中存在連續(xù)的“1”。出現(xiàn)這個(gè)問(wèn)題的原因是列表的自動(dòng)內(nèi)存管理功能。在刪除列表元素時(shí),Python會(huì)自動(dòng)對(duì)列表內(nèi)存進(jìn)行收縮并移動(dòng)列表元素以保證所有元素之間沒(méi)有空隙,增加列表元素時(shí)也會(huì)自動(dòng)擴(kuò)展內(nèi)存并對(duì)元素進(jìn)行移動(dòng)以保證元素之間沒(méi)有空隙。每當(dāng)插入或刪除一個(gè)元素之后,該元素位置后面所有元素的索引就都改變了。4.1.3列表元素的刪除正確的代碼:>>>x=[1,2,1,2,1,1,1]>>>foriinx[::]:#切片ifi==1: x.remove(i)或者:>>>x=[1,2,1,2,1,1,1]>>>foriinrange(len(x)-1,-1,-1):#從后往前刪ifx[i]==1:delx[i]

4.1.4列表元素訪(fǎng)問(wèn)與計(jì)數(shù)使用下標(biāo)直接訪(fǎng)問(wèn)列表元素,如果指定下標(biāo)不存在,則拋出異常。>>>aList[3]6>>>aList[3]=5.5>>>aList[3,4,5,5.5,7,9,11,13,15,17]>>>aList[15]Traceback(mostrecentcalllast):File"<pyshell#34>",line1,in<module>aList[15]IndexError:listindexoutofrange4.1.4列表元素訪(fǎng)問(wèn)與計(jì)數(shù)使用列表對(duì)象的index()方法獲取指定元素首次出現(xiàn)的下標(biāo),若列表對(duì)象中不存在指定元素,則拋出異常。>>>aList[3,4,5,5.5,7,9,11,13,15,17]>>>aList.index(7)4>>>aList.index(100)Traceback(mostrecentcalllast):File"<pyshell#36>",line1,in<module>aList.index(100)ValueError:100isnotinlist4.1.4列表元素訪(fǎng)問(wèn)與計(jì)數(shù)使用列表對(duì)象的count()方法統(tǒng)計(jì)指定元素在列表對(duì)象中出現(xiàn)的次數(shù)。>>>aList[3,4,5,5.5,7,9,11,13,15,17]>>>aList.count(7)1>>>aList.count(0)0>>>aList.count(8)04.1.5成員資格判斷使用in關(guān)鍵字來(lái)判斷一個(gè)值是否存在于列表中,返回結(jié)果為“True”或“False”。>>>aList[3,4,5,5.5,7,9,11,13,15,17]>>>3inaListTrue>>>18inaListFalse>>>bList=[[1],[2],[3]]>>>3inbListFalse>>>3notinbListTrue>>>[3]inbListTrue>>>aList=[3,5,7,9,11]>>>bList=['a','b','c','d']>>>(3,'a')inzip(aList,bList)True>>>fora,binzip(aList,bList): print(a,b)4.1.6切片操作切片適用于列表、元組、字符串、range對(duì)象等類(lèi)型,但作用于列表時(shí)功能最強(qiáng)大??梢允褂们衅瑏?lái)截取列表中的任何部分,得到一個(gè)新列表,也可以通過(guò)切片來(lái)修改和刪除列表中部分元素,甚至可以通過(guò)切片操作為列表對(duì)象增加元素。切片使用2個(gè)冒號(hào)分隔的3個(gè)數(shù)字來(lái)完成:第一個(gè)數(shù)字表示切片開(kāi)始位置(默認(rèn)為0)。第二個(gè)數(shù)字表示切片截止(但不包含)位置(默認(rèn)為列表長(zhǎng)度)。第三個(gè)數(shù)字表示切片的步長(zhǎng)(默認(rèn)為1),當(dāng)步長(zhǎng)省略時(shí)可以順便省略最后一個(gè)冒號(hào)。切片操作不會(huì)因?yàn)橄聵?biāo)越界而拋出異常,而是簡(jiǎn)單地在列表尾部截?cái)嗷蛘叻祷匾粋€(gè)空列表,代碼具有更強(qiáng)的健壯性。4.1.6切片操作>>>aList=[3,4,5,6,7,9,11,13,15,17]>>>aList[::]#返回包含所有元素的新列表[3,4,5,6,7,9,11,13,15,17]>>>aList[::-1]#逆序的所有元素[17,15,13,11,9,7,6,5,4,3]>>>aList[::2]#偶數(shù)位置,隔一個(gè)取一個(gè)[3,5,7,11,15]>>>aList[1::2]#奇數(shù)位置,隔一個(gè)取一個(gè)[4,6,9,13,17]>>>aList[3::]#從下標(biāo)3開(kāi)始的所有元素[6,7,9,11,13,15,17]>>>aList[3:6]#下標(biāo)在[3,6)之間的所有元素[6,7,9]>>>aList[0:100:1]#前100個(gè)元素,自動(dòng)截?cái)郲3,4,5,6,7,9,11,13,15,17]>>>aList[100:]#下標(biāo)100之后的所有元素,自動(dòng)截?cái)郲]>>>aList[100]#直接使用下標(biāo)訪(fǎng)問(wèn)會(huì)發(fā)生越界IndexError:listindexoutofrange4.1.6切片操作可以使用切片來(lái)原地修改列表內(nèi)容>>>aList=[3,5,7]>>>aList[len(aList):]=[9]#在尾部追加元素>>>aList[3,5,7,9]>>>aList[:3]=[1,2,3]#替換前3個(gè)元素>>>aList[1,2,3,9]>>>aList[:3]=[]#刪除前3個(gè)元素>>>aList[9]>>>aList=list(range(10))>>>aList[0,1,2,3,4,5,6,7,8,9]>>>aList[::2]=[0]*5#替換偶數(shù)位置上的元素>>>aList[0,1,0,3,0,5,0,7,0,9]>>>aList[::2]=[0]*3#切片不連續(xù),兩個(gè)元素個(gè)數(shù)必須一樣多ValueError:attempttoassignsequenceofsize3toextendedsliceofsize54.1.6切片操作使用del與切片結(jié)合來(lái)刪除列表元素>>>aList=[3,5,7,9,11]>>>delaList[:3]#刪除前3個(gè)元素>>>aList[9,11]>>>aList=[3,5,7,9,11]>>>delaList[::2]#刪除偶數(shù)位置上的元素>>>aList[5,9]4.1.6切片操作切片返回的是列表元素的淺復(fù)制>>>aList=[3,5,7]>>>bList=aList#bList與aList指向同一個(gè)內(nèi)存>>>bList[3,5,7]>>>bList[1]=8#修改其中一個(gè)對(duì)象會(huì)影響另一個(gè)>>>aList[3,8,7]>>>aList==bList#兩個(gè)列表的元素完全一樣True>>>aListisbList#兩個(gè)列表是同一個(gè)對(duì)象True>>>id(aList)#內(nèi)存地址相同19061816>>>id(bList)190618164.1.6切片操作所謂淺復(fù)制,是指生成一個(gè)新的列表,并且把原列表中所有元素的引用都復(fù)制到新列表中。如果原列表中只包含整數(shù)、實(shí)數(shù)、復(fù)數(shù)等基本類(lèi)型或元組、字符串這樣的不可變類(lèi)型的數(shù)據(jù),一般是沒(méi)有問(wèn)題的。>>>aList=[3,5,7]>>>bList=aList[::]#切片,淺復(fù)制>>>aList==bList#兩個(gè)列表的元素完全一樣True>>>aListisbList#但不是同一個(gè)對(duì)象False>>>id(aList)==id(bList)#內(nèi)存地址不一樣False>>>bList[1]=8#修改其中一個(gè)不會(huì)影響另一個(gè)>>>bList[3,8,7]>>>aList[3,5,7]如果原列表中包含列表之類(lèi)的可變數(shù)據(jù)類(lèi)型,由于淺復(fù)制時(shí)只是把子列表的引用復(fù)制到新列表中,這樣的話(huà)修改任何一個(gè)都會(huì)影響另外一個(gè)。>>>x=[1,2,[3,4]]>>>y=x[:]>>>x[0]=5>>>x[5,2,[3,4]]>>>y[1,2,[3,4]]>>>x[2].append(6)>>>x[5,2,[3,4,6]]>>>y[1,2,[3,4,6]]4.1.6切片操作一個(gè)非常棒的網(wǎng)站:/live.html#mode=edit4.1.6切片操作4.1.7列表排序使用列表對(duì)象的sort()方法進(jìn)行原地排序,支持多種不同的排序方法。>>>aList=[3,4,5,6,7,9,11,13,15,17]>>>importrandom>>>random.shuffle(aList)>>>aList[3,4,15,11,9,17,13,6,7,5]>>>aList.sort()#默認(rèn)是升序排序>>>aList.sort(reverse=True)#降序排序>>>aList[17,15,13,11,9,7,6,5,4,3]>>>aList.sort(key=lambdax:len(str(x)))#按轉(zhuǎn)換成字符串的長(zhǎng)度排序>>>aList[9,7,6,5,4,3,17,15,13,11]4.1.7列表排序使用內(nèi)置函數(shù)sorted()對(duì)列表進(jìn)行排序并返回新列表>>>aList[9,7,6,5,4,3,17,15,13,11]>>>sorted(aList)#升序排序[3,4,5,6,7,9,11,13,15,17]>>>sorted(aList,reverse=True)#降序排序[17,15,13,11,9,7,6,5,4,3]4.1.7列表排序使用列表對(duì)象的reverse()方法將元素原地逆序>>>aList=[3,4,5,6,7,9,11,13,15,17]>>>aList.reverse()>>>aList[17,15,13,11,9,7,6,5,4,3]4.1.7列表排序使用內(nèi)置函數(shù)reversed()對(duì)列表元素進(jìn)行逆序排列并返回迭代對(duì)象>>>aList=[3,4,5,6,7,9,11,13,15,17]>>>newList=reversed(aList)#返回reversed對(duì)象>>>list(newList)#把reversed對(duì)象轉(zhuǎn)換成列表[17,15,13,11,9,7,6,5,4,3]>>>foriinnewList:print(i,end='')#這里沒(méi)有輸出內(nèi)容

#迭代對(duì)象已遍歷結(jié)束>>>newList=reversed(aList)#重新創(chuàng)建reversed對(duì)象>>>foriinnewList:print(i,end='')171513119765434.2元組元組和列表類(lèi)似,但屬于不可變序列,元組一旦創(chuàng)建,用任何方法都不可以修改其元素。元組的定義方式和列表相同,但定義時(shí)所有元素是放在一對(duì)圓括號(hào)“()”中,而不是方括號(hào)中。4.2.1元組創(chuàng)建與刪除使用“=”將一個(gè)元組賦值給變量>>>a_tuple=('a','b','mpilgrim','z','example')>>>a_tuple('a','b','mpilgrim','z','example')>>>a=(3)>>>a3>>>a=(3,)

#包含一個(gè)元素的元組,最后必須多寫(xiě)個(gè)逗號(hào)>>>a(3,)>>>a=3,#也可以這樣創(chuàng)建元組>>>a(3,)>>>x=()#空元組4.2.1元組創(chuàng)建與刪除使用tuple函數(shù)將其他序列轉(zhuǎn)換為元組>>>tuple('abcdefg')#把字符串轉(zhuǎn)換為元組('a','b','c','d','e','f','g')>>>aList[-1,-4,6,7.5,-2.3,9,-11]>>>tuple(aList)#把列表轉(zhuǎn)換為元組(-1,-4,6,7.5,-2.3,9,-11)>>>s=tuple()#空元組>>>s()使用del可以刪除元組對(duì)象,不能刪除元組中的元素4.2.2元組與列表的區(qū)別元組一旦定義就不允許更改。元組沒(méi)有append()、extend()和insert()等方法,無(wú)法向元組中添加元素。元組沒(méi)有remove()或pop()方法,也無(wú)法對(duì)元組元素進(jìn)行del操作,不能從元組中刪除元素。從效果上看,tuple()凍結(jié)列表,而list()融化元組。4.2.2

元組的優(yōu)點(diǎn)元組的速度比列表更快。如果定義了一系列常量值,而所需做的僅是對(duì)它進(jìn)行遍歷,那么一般使用元組而不用列表。元組對(duì)不需要改變的數(shù)據(jù)進(jìn)行“寫(xiě)保護(hù)”將使得代碼更加安全。元組可用作字典的“鍵”,也可以作為集合的元素。列表永遠(yuǎn)不能當(dāng)做字典鍵使用,也不能作為集合的元素,因?yàn)榱斜聿皇遣豢勺兊摹?.2.3

序列解包可以使用序列解包功能對(duì)多個(gè)變量同時(shí)賦值>>>x,y,z=1,2,3#多個(gè)變量同時(shí)賦值>>>v_tuple=(False,3.5,'exp')>>>(x,y,z)=v_tuple>>>x,y,z=v_tuple>>>x,y,z=range(3)#可以對(duì)range對(duì)象進(jìn)行序列解包>>>x,y,z=iter([1,2,3])#使用迭代器對(duì)象進(jìn)行序列解包>>>x,y,z=map(str,range(3))#使用可迭代的map對(duì)象進(jìn)行序列解包>>>a,b=b,a#交換兩個(gè)變量的值>>>x,y,z=sorted([1,3,2])#sorted()函數(shù)返回排序后的列表>>>a,b,c='ABC'#字符串也支持序列解包>>>x=[1,2,3,4,5,6]>>>x[:3]=map(str,range(5))#切片也支持序列解包>>>x['0','1','2','3','4',4,5,6]4.2.3

序列解包序列解包對(duì)于列表和字典同樣有效>>>s={'a':1,'b':2,'c':3}>>>b,c,d=s.items()>>>b('c',3)>>>b,c,d=s#使用字典時(shí)不用太多考慮元素的順序>>>b'c'>>>b,c,d=s.values()>>>print(b,c,d)1324.2.3

序列解包序列解包遍歷多個(gè)序列>>>keys=['a','b','c','d']>>>values=[1,2,3,4]>>>fork,vinzip(keys,values): print((k,v),end='')('a',1)('b',2)('c',3)('d',4)使用序列解包遍歷enumerate對(duì)象>>>x=['a','b','c']>>>fori,vinenumerate(x): print('Thevalueonposition{0}is{1}'.format(i,v))Thevalueonposition0isaThevalueonposition1isbThevalueonposition2isc4.2.3

序列解包4.2.3

序列解包>>>aList=[1,2,3]>>>bList=[4,5,6]>>>cList=[7,8,9]>>>dList=zip(aList,bList,cList)>>>forindex,valueinenumerate(dList): print(index,':',value)0:(1,4,7)1:(2,5,8)2:(3,6,9)4.2.3

序列解包Python3.5還支持下面用法的序列解包>>>print(*[1,2,3],4,*(5,6))123456>>>*range(4),4(0,1,2,3,4)>>>{*range(4),4,*(5,6,7)}{0,1,2,3,4,5,6,7}>>>{'x':1,**{'y':2}}{'y':2,'x':1}4.3字典字典是無(wú)序、可變序列。定義字典時(shí),每個(gè)元素的鍵和值用冒號(hào)分隔,元素之間用逗號(hào)分隔,所有的元素放在一對(duì)大括號(hào)“{}”中。字典中的鍵可以為任意不可變數(shù)據(jù),比如整數(shù)、實(shí)數(shù)、復(fù)數(shù)、字符串、元組等等。globals()返回包含當(dāng)前作用域內(nèi)所有全局變量和值的字典locals()返回包含當(dāng)前作用域內(nèi)所有局部變量和值的字典4.3.1字典創(chuàng)建與刪除使用=將一個(gè)字典賦值給一個(gè)變量>>>a_dict={'server':'','database':'mysql'}>>>a_dict{'database':'mysql','server':''}>>>x={}#空字典>>>x{}4.3.1字典創(chuàng)建與刪除使用dict利用已有數(shù)據(jù)創(chuàng)建字典:>>>keys=['a','b','c','d']>>>values=[1,2,3,4]>>>dictionary=dict(zip(keys,values))>>>dictionary{'a':1,'c':3,'b':2,'d':4}>>>x=dict()#空字典>>>x{}使用dict根據(jù)給定的鍵、值創(chuàng)建字典>>>d=dict(name='Dong',age=37)>>>d{'age':37,'name':'Dong'}4.3.1字典創(chuàng)建與刪除4.3.1字典創(chuàng)建與刪除以給定內(nèi)容為鍵,創(chuàng)建值為空的字典>>>adict=dict.fromkeys(['name','age','sex'])>>>adict{'age':None,'name':None,'sex':None}可以使用del刪除整個(gè)字典4.3.2字典元素的讀取以鍵作為下標(biāo)可以讀取字典元素,若鍵不存在則拋出異常>>>aDict={'name':'Dong','sex':'male','age':37}>>>aDict['name']'Dong'>>>aDict['tel']#鍵不存在,拋出異常Traceback(mostrecentcalllast):File"<pyshell#53>",line1,in<module>aDict['tel']KeyError:'tel'4.3.2字典元素的讀取使用字典對(duì)象的get方法獲取指定鍵對(duì)應(yīng)的值,并且可以在鍵不存在的時(shí)候返回指定值。>>>print(aDict.get('address'))None>>>print(aDict.get('address','SDIBT'))SDIBT>>>aDict['score']=aDict.get('score',[])>>>aDict['score'].append(98)>>>aDict['score'].append(97)>>>aDict{'age':37,'score':[98,97],'name':'Dong','sex':'male'}4.3.2字典元素的讀取使用字典對(duì)象的items()方法可以返回字典的鍵、值對(duì)使用字典對(duì)象的keys()方法可以返回字典的鍵使用字典對(duì)象的values()方法可以返回字典的值4.3.2字典元素的讀取>>>aDict={'name':'Dong','sex':'male','age':37}>>>foriteminaDict.items():#輸出字典中所有元素print(item)('age',37)('name','Dong')('sex','male')>>>forkeyinaDict:#不加特殊說(shuō)明,默認(rèn)輸出鍵print(key)agenamesex4.3.2字典元素的讀取>>>forkey,valueinaDict.items():#序列解包用法 print(key,value)age37nameDongsexmale>>>aDict.keys()#返回所有鍵dict_keys(['name','sex','age'])>>>aDict.values()#返回所有值dict_values(['Dong','male',37])4.3.3字典元素的添加與修改當(dāng)以指定鍵為下標(biāo)為字典賦值時(shí):1)若鍵存在,則可以修改該鍵的值;2)若不存在,則表示添加一個(gè)鍵、值對(duì)。>>>aDict['age']=38#修改元素值>>>aDict{'age':38,'name':'Dong','sex':'male'}>>>aDict['address']='SDIBT'#增加新元素>>>aDict{'age':38,'address':'SDIBT','name':'Dong','sex':'male'}4.3.3字典元素的添加與修改使用字典對(duì)象的update()方法將另一個(gè)字典的鍵、值對(duì)添加到當(dāng)前字典對(duì)象。>>>aDict{'age':37,'score':[98,97],'name':'Dong','sex':'male'}>>>aDict.items()dict_items([('age',37),('score',[98,97]),('name','Dong'),('sex','male')])>>>aDict.update({'a':'a','b':'b'})>>>aDict{'a':'a','score':[98,97],'name':'Dong','age':37,'b':'b','sex':'male'}4.3.3字典元素的添加與修改使用del刪除字典中指定鍵的元素使用字典對(duì)象的clear()方法來(lái)刪除字典中所有元素使用字典對(duì)象的pop()方法刪除并返回指定鍵的元素使用字典對(duì)象的popitem()方法刪除并返回字典中的一個(gè)元素4.3.4字典應(yīng)用案例首先生成包含1000個(gè)隨機(jī)字符的字符串,然后統(tǒng)計(jì)每個(gè)字符的出現(xiàn)次數(shù)。>>>importstring>>>importrandom>>>x=string.ascii_letters+string.digits\

+string.punctuation>>>y=[random.choice(x)foriinrange(1000)]>>>z=''.join(y)>>>d=dict()#使用字典保存每個(gè)字符出現(xiàn)次數(shù)>>>forchinz:d[ch]=d.get(ch,0)+14.3.4字典應(yīng)用案例也可以使用collections模塊的defaultdict類(lèi)來(lái)實(shí)現(xiàn)。>>>fromcollectionsimportdefaultdict>>>frequences=defaultdict(int)>>>frequencesdefaultdict(<type'int'>,{})>>>foriteminz:frequences[item]+=1>>>frequences.items()4.3.4字典應(yīng)用案例使用collections模塊的Counter類(lèi)可以快速實(shí)現(xiàn)這個(gè)功能,并且提供更多功能,例如查找出現(xiàn)次數(shù)最多的元素。>>>fromcollectionsimportCounter>>>frequences=Counter(z)>>>frequences.items()>>>frequences.most_common(1)#出現(xiàn)次數(shù)最多的一個(gè)字符[('A',22)]>>>frequences.most_common(3)[('A',22),(';',18),('`',17)]4.3.4字典應(yīng)用案例Counter對(duì)象用法示例>>>cnt=Counter()>>>forwordin['red','blue','red','green','blue','blue']:cnt[word]+=1>>>cntCounter({'blue':3,'red':2,'green':1})>>>importre>>>words=re.findall(r'\w+',open('hamlet.txt').read().lower())>>>Counter(words).most_common(10)#出現(xiàn)次數(shù)最多的10個(gè)單詞4.3.5有序字典Python內(nèi)置字典是無(wú)序的,如果需要一個(gè)可以記住元素插入順序的字典,可以使用collections.OrderedDict。>>>x=dict()#無(wú)序字典>>>x['a']=3>>>x['b']=5>>>x['c']=8>>>x{'b':5,'c':8,'a':3}>>>importcollections>>>x=collections.OrderedDict()#有序字典>>>x['a']=3>>>x['b']=5>>>x['c']=8>>>xOrderedDict([('a',3),('b',5),('c',8)])4.3.6字典推導(dǎo)式>>>s={x:x.strip()forxin('he','she','I')}>>>s{'he':'he','I':'I','she':'she'}>>>fork,vins.items(): print(k,':',v)he:heI:Ishe:she4.3.6字典推導(dǎo)式>>>{i:str(i)foriinrange(1,5)}{1:'1',2:'2',3:'3',4:'4'}>>>x=['A','B','C','D']>>>y=['a','b','b','d']>>>{i:jfori,jinzip(x,y)}{'A':'a','C':'b','B':'b','D':'d'}4.4集合集合是無(wú)序、可變序列,使用一對(duì)大括號(hào)界定,元素不可重復(fù),同一個(gè)集合中每個(gè)元素都是唯一的。集合中只能包含數(shù)字、字符串、元組等不可變類(lèi)型(或者說(shuō)可哈希)的數(shù)據(jù),而不能包含列表、字典、集合等可變類(lèi)型的數(shù)據(jù)。4.4.1

集合的創(chuàng)建與刪除直接將集合賦值給變量>>>a={3,5}>>>a.add(7)#向集合中添加元素>>>a{3,5,7}使用set將其他類(lèi)型數(shù)據(jù)轉(zhuǎn)換為集合>>>a_set=set(range(8,14))>>>a_set{8,9,10,11,12,13}>>>b_set=set([0,1,2,3,0,1,2,3,7,8])#自動(dòng)去除重復(fù)>>>b_set{0,1,2,3,7,8}>>>c_set=set()#空集合>>>c_setset()使用del刪除整個(gè)集合4.4.1

集合的創(chuàng)建與刪除4.4.1

集合的創(chuàng)建與刪除當(dāng)不再使用某個(gè)集合時(shí),可以使用del命令刪除整個(gè)集合。集合對(duì)象的pop()方法彈出并刪除其中一個(gè)元素,remove()方法直接刪除指定元素,clear()方法清空集合。>>>a={1,4,2,3}>>>a.pop()1>>>a.pop()2>>>a{3,4}>>>a.add(2)>>>a{2,3,4}>>>a.remove(3)>>>a{2,4}4.4.2集合操作Python集合支持交集、并集、差集等運(yùn)算>>>a_set=set([8,9,10,11,12,13])>>>b_set={0,1,2,3,7,8}>>>a_set|b_set#并集{0,1,2,3,7,8,9,10,11,12,13}>>>a_set.union(b_set)#并集{0,1,2,3,7,8,9,10,11,12,13}>>>a_set&b_set#交集{8}>>>a_ersection(b_set)#交集{8}>>>a_set.difference(b_set)#差集{9,10,11,12,13}>>>a_set-b_set{9,10,11,12,13}>>>a_set.symmetric_difference(b_set)#對(duì)稱(chēng)差集{0,1,2,3,7,9,10,11,12,13}>>>a_set^b_set{0,1,2,3,7,9,10,11,12,13}>>>x={1,2,3}>>>y={1,2,5}>>>z={1,2,3,4}>>>x.issubset(y)#測(cè)試是否為子集False>>>x.issubset(z)True>>>{3}&{4}set()>>>{3}.isdisjoint({4})#如果兩個(gè)集合的交集為空,返回TrueTrue4.4.2集合操作集合包含關(guān)系測(cè)試>>>x={1,2,3}>>>y={1,2,5}>>>z={1,2,3,4}>>>x<y#比較集合大小/包含關(guān)系False>>>x<z#真子集True>>>y<zFalse>>>{1,2,3}<={1,2,3}#子集True4.4.2集合操作4.4.2集合操作使用集合快速提取序列中單一元素>>>importrandom>>>listRandom=[random.choice(range(10000))foriinrange(100)]>>>noRepeat=[]>>>foriinlistRandom: ifinotinnoRepeat: noRepeat.append(i)>>>len(listRandom)>>>len(noRepeat)>>>newSet=set(listRandom)4.4.3集合運(yùn)用案例例2-1生成不重復(fù)隨機(jī)數(shù)的效率比較。importrandomimporttimedefRandomNumbers(number,start,end):'''使用列表來(lái)生成number個(gè)介于start和end之間的不重復(fù)隨機(jī)數(shù)'''data=[]n=0whileTrue:element=random.randint(start,end)ifelementnotindata:data.append(element)n+=1ifn==number:breakreturndata4.4.3集合運(yùn)用案例defRandomNumbers1(number,start,end):'''使用列表來(lái)生成number個(gè)介于start和end之間的不重復(fù)隨機(jī)數(shù)'''data=[]whileTrue:element=random.randint(start,end)ifelementnotindata:data.append(element)iflen(data)==number:breakreturndata4.4.3集合運(yùn)用案例defRandomNumbers2(number,start,end):'''使用集合來(lái)生成number個(gè)介于start和end之間的不重復(fù)隨機(jī)數(shù)'''data=set()whileTrue:data.add(random.randint(start,end))iflen(data)==number:breakreturndata4.4.3集合運(yùn)用案例#數(shù)字范圍begin,end=1,100000#要獲取的不重復(fù)數(shù)字個(gè)數(shù)num=50000#重復(fù)測(cè)試次數(shù)rep=10forranin(RandomNumbers,RandomNumbers1,RandomNumbers2):start=time.time()foriinrange(rep):ran(num,begin,en

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論