版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第5章字符串與文本分析字符串編碼字符串的索引與分片字符串的操作字節(jié)類型正則表達(dá)式字符串應(yīng)用舉例文本分析1.Unicode碼Unicode編碼標(biāo)準(zhǔn)為表達(dá)全世界所有語言的任意字符而設(shè)計,它使用4字節(jié)的數(shù)字編碼來表達(dá)每個字母、符號或文字。每個數(shù)字編碼代表唯一的至少在某種語言中使用的符號,被幾種語言共用的字符通常使用相同的數(shù)字來編碼,每個字符對應(yīng)一個數(shù)字編碼,每個數(shù)字編碼對應(yīng)一個字符,即不存在二義性。5.1字符串編碼2.UTF-8碼UTF-8是一種為Unicode字符設(shè)計的變長編碼系統(tǒng),即不同的字符可使用不同數(shù)量的字節(jié)編碼。對于ASCII字符,UTF-8僅使用1個字節(jié)來編碼。UTF-8支持中英文編碼,英文系統(tǒng)也可以顯示中文。Python支持UTF-8編碼,中文字符、希臘字母均可以作為標(biāo)識符使用。例如:>>>π=3.14159>>>國家='中國'3.Unicode碼與UTF-8碼的轉(zhuǎn)換在Python中,可以通過字符串的encode()方法從Unicode編碼為指定編碼方式。decode()方法從指定編碼方式解碼為Unicode方式。例如:>>>s='漢字ABC'>>>k=s.encode('utf-8')>>>kb'\xe6\xb1\x89\xe5\xad\x97ABC'>>>k.decode('utf-8')'漢字ABC'5.2.1字符串的索引為了實現(xiàn)索引,需要對字符串中的字符進(jìn)行編號,最左邊字符編號為0,最右邊字符的編號比字符串的長度小1。Python還支持在字符串中使用負(fù)數(shù)從右向左進(jìn)行編號,最右邊的字符(即倒數(shù)第1個字符)的編號為-1。字符串變量名后接用中括號括起來的編號即可實現(xiàn)字符串的索引。5.2字符串的索引與分片例如:>>>s="Hello"字符串s中各個字符的索引編號如圖所示。例5-1將一個字符串中的字符按逆序打印出來。分析:先輸出字符串的最后一個字符,且不換行,然后輸出倒數(shù)第2個字符,同樣不換行,一直到第1個字符。利用for循環(huán)控制字符索引編號,循環(huán)賦值目標(biāo)變量從0變化到字符串的長度。取字符串的長度可以利用len()函數(shù)。程序如下:s1=input("Pleaseenterastring:")foriinrange(0,len(s1)):print(s1[len(s1)-1-i],end='')5.2.2字符串的分片字符串的分片就是從給定的字符串中分離出部分字符,這時可以使用以下形式的字符串索引編號。i:j:k其中i是索引起始位置,j是索引結(jié)束位置但不包括j位置上的字符,索引編號每次增加的步長為k。例如:>>>s="HelloWorld!">>>print(s[0:5:2])Hlo>>>s='abcdefg'>>>s[5:1:-1]'fedc'>>>s[-len(s):-1]'abcdef'例5-2利用字符串分片方法將一個字符串中的字符按逆序打印出來。程序如下:s1=input("Pleaseenterastring:")s2=s1[::-1]print(s2)5.3.1字符串連接操作1.基本連接操作字符串表達(dá)式是指用“連接”運(yùn)算符把字符串常量、字符串變量等字符串?dāng)?shù)據(jù)連接起來的有意義的式子,它的一般格式是:s1+s2+……+sn其中s1,s2,……,sn均是一個字符串,表達(dá)式的值也是一個字符串。例如:>>>"Sub"+"string"'Substring'5.3字符串的操作2.重復(fù)連接操作Python提供乘法運(yùn)算符(*),構(gòu)建一個由其自身字符串重復(fù)連接而成的字符串。字符串重復(fù)連接的一般格式是:s*n或n*s其中s是一個字符串;n是一個正整數(shù),代表重復(fù)的次數(shù)。例如:>>>"ABCD"*2'ABCDABCD'例5-3從鍵盤輸入5個字符串,將它們連接成一個字符串后輸出。s=''foriinrange(0,5):c=input("Pleaseenterastring:")s+=cprint(s)3.連接操作的其他實現(xiàn)對于連接操作,可以用格式化操作符或join()函數(shù)取代,這樣只會有一次內(nèi)存的申請,以提高操作效率。例如:>>>'{:s}{:s}{:s}'.format('Python','','Program')'PythonProgram'>>>''.join(['Python','','Program'])'PythonProgram'5.3.2字符串邏輯操作1.關(guān)系操作在進(jìn)行字符串?dāng)?shù)據(jù)的比較時,遵循以下規(guī)則。(1)單個字符比較,按字符ASCII碼大小進(jìn)行比較。(2)兩個相同長度的字符串的比較是將字符串中的字符從左向右逐個比較,如果所有字符都相等,則兩個字符串相等,如果兩個字符串中有不同的字符,以最左邊的第1對不同字符的比較結(jié)果為準(zhǔn)。(3)若兩個字符串中字符個數(shù)不等時,則將較短的字符串后面補(bǔ)足空格后再比較。例5-4從鍵盤輸入10個英文單詞,輸出其中以元音字母開頭的單詞。分析:輸入一個英文單詞,并進(jìn)行判斷,用for循環(huán)控制重復(fù)執(zhí)行10次??梢詫⑺性糇帜笜?gòu)成一個字符串,遍歷該字符串中的各個字符,并判斷單詞的首字母。2.成員關(guān)系操作字符串的成員關(guān)系操作包括in和notin操作,一般格式為:字符串1[not]in字符串2該操作用于判斷字符串1是否屬于字符串2,其返回值為True或False.例如:>>>'a'in'abc'True5.3.3字符串的常用方法函數(shù)可以通過函數(shù)名直接調(diào)用,如ord('A'),而對象中的方法則要通過對象名和方法名來調(diào)用,一般形式為:對象名.方法名(參數(shù))在Python中,字符串類型(String)可以看成是一個類(Class),而一個具體的字符串可以看成是一個對象,該對象具有很多方法,這些方法是通過類的成員函數(shù)來實現(xiàn)的。1.字母大小寫轉(zhuǎn)換s.upper():全部轉(zhuǎn)換為大寫字母。s.lower():全部轉(zhuǎn)換為小寫字母。s.swapcase():字母大小寫互換。s.capitalize():首字母大寫,其余小寫。s.title():首字母大寫。例5-5字母大小寫轉(zhuǎn)換函數(shù)使用示例。程序如下:s='PythonProgram'print('{:s}lower={:s}'.format(s,s.lower()))print('{:s}upper={:s}'.format(s,s.upper()))print('{:s}swapcase={:s}'.format(s,s.swapcase()))print('{:s}capitalize={:s}'.format(s,s.capitalize()))print('{:s}title={:s}'.format(s,s.title()))2.字符串對齊處理s.ljust(width,[fillchar]):輸出width個字符,s左對齊,右邊不足部分用fillchar填充,默認(rèn)用空格填充。s.rjust(width,[fillchar]):輸出width個字符,s右對齊,左邊不足部分用fillchar填充,默認(rèn)用空格填充。s.center(width,[fillchar])輸出width個字符,s中間對齊,兩邊不足部分用fillchar填充,默認(rèn)用空格填充。s.zfill(width):把s變成width長,并且右對齊,左邊不足部分用0補(bǔ)齊。例5-6字符串對齊處理函數(shù)使用示例。程序如下:s='PythonProgram'print('{:s}ljust={:s}'.format(s,s.ljust(20)))print('{:s}rjust={:s}'.format(s,s.rjust(20)))print('{:s}center={:s}'.format(s,s.center(20)))print('{:s}zfill={:s}'.format(s,s.zfill(20)))3.字符串搜索s.find(substr,[start,[end]]):返回s中出現(xiàn)substr的第1個字符的編號,如果s中沒有substr則返回-1。start和end作用就相當(dāng)于在s[start:end]中搜索。s.index(substr,[start,[end]]):與find()相同,只是在s中沒有substr時,會返回一個運(yùn)行時錯誤。s.rfind(substr,[start,[end]]):返回s中最后出現(xiàn)的substr的第1個字符的編號,如果s中沒有substr則返回-1,也就是說從右邊算起的第1次出現(xiàn)的substr的首字符編號。3.字符串搜索s.rindex(substr,[start,[end]]):與rfind()相同,只是在s中沒有substr時,會返回一個運(yùn)行時錯誤。s.count(substr,[start,[end]]):計算substr在s中出現(xiàn)的次數(shù)。s.startswith(prefix[,start[,end]]):是否以prefix開頭,若是返回True,否則返回False。s.endswith(suffix[,start[,end]]):以suffix結(jié)尾,若是返回True,否則返回False。例5-7字符串搜索函數(shù)使用示例。程序如下:s='PythonProgram'print('{:s}findnono={:d}'.format(s,s.find('nono')))print('{:s}findt={:d}'.format(s,s.find('t')))print('{:s}findtfrom{:d}={:d}'.format(s,1,s.find('t',1)))print('{:s}findtfrom{:d}to{:d}={:d}'.format(s,1,2,s.find('t',1,2)))print('{:s}rfindt={:d}'.format(s,s.rfind('t')))print('{:s}countt={:d}'.format(s,s.count('t')))4.字符串替換s.replace(oldstr,newstr,[count]):把s中的oldstar替換為newstr,count為替換次數(shù)。這是替換的通用形式,還有一些函數(shù)進(jìn)行特殊字符的替換。s.strip([chars]):把s中前后chars中有的字符全部去掉,可以理解為把s前后chars替換為None。默認(rèn)去掉前后空格。s.lstrip([chars]):把s左邊chars中有的字符全部去掉。默認(rèn)去掉左邊空格。s.rstrip([chars]):把s右邊chars中有的字符全部去掉。默認(rèn)去掉右邊空格。s.expandtabs([tabsize]):把s中的tab字符替換為空格,每個tab替換為tabsize個空格,默認(rèn)是8個。例5-8字符串替換函數(shù)使用示例。程序如下:s='PythonProgram'print('{:s}replacetto*={:s}'.format(s,s.replace('t','*')))print('{:s}replacetto*={:s}'.format(s,s.replace('t','*',1)))print('{:s}strip={:s}'.format(s,s.strip()))print('{:s}strip={:s}'.format(s,s.strip('Pm')))5.字符串的拆分與組合s.split([sep,[maxsplit]]):以sep為分隔符,把字符串s拆分成一個列表。默認(rèn)的分隔符為空格。maxsplit表示拆分的次數(shù),默認(rèn)取-1,表示無限制拆分。s.rsplit([sep,[maxsplit]]):從右側(cè)把字符串s拆分成一個列表。s.splitlines([keepends]):把s按行拆分分為一個列表。keepends是一個邏輯值,如果為True,則每行拆分后會保留行分隔符。s.partition(sub):從sub出現(xiàn)的第1個位置起,把字符串s拆分成一個3元素的元組(sub左邊字符,sub,sub右邊字符)。如果s中不包含sub則返回(s,'','')。s.rpartition(sub):從右側(cè)開始,把字符串s拆分成一個3元素的元組(sub左邊字符,sub,sub右邊字符)。如果s中不包含sub則返回('','',s)。s.join(seq):把seq代表的序列組合成字符串,用s將序列各元素連接起來。字符串中的字符是不能修改的,如果要修改,通常的方法是,用list()函數(shù)把字符串s變?yōu)橐詥蝹€字符為成員的列表(使用語句s=list(s)),再使用給列表成員賦值的方式改變值(如s[3]='a'),最后再使用語句“s="".join(s)”還原成字符串。例5-9字符串拆分與組合函數(shù)使用示例。程序如下:s='abcde'print('{:s}split={}'.format(s,s.split()))s='a-b-c-de'print('{:s}split={}'.format(s,s.split('-')))print('{:s}partition={}'.format(s,s.partition('-')))6.字符串類型測試字符串類型測試函數(shù)返回的都是邏輯值。s.isalnum():是否全是字母和數(shù)字,并至少有一個字符s.isalpha():是否全是字母,并至少有一個字符s.isdigit():是否全是數(shù)字,并至少有一個字符s.isspace():是否全是空格,并至少有一個字符s.islower():s中的字母是否全是小寫s.isupper():s中的字母是否便是大寫s.istitle():s是否是首字母大寫例5-10字符串測試函數(shù)使用示例。程序如下:s='PythonProgram'print('{:s}isalnum={}'.format(s,s.isalnum()))print('{:s}isalpha={}'.format(s,s.isalpha()))print('{:s}isupper={}'.format(s,s.isupper()))print('{:s}islower={}'.format(s,s.islower()))print('{:s}isdigit={}'.format(s,s.isdigit()))s='3423'print('{:s}isdigit={}'.format(s,s.isdigit()))字符串是由Unicode字符組成的序列,用str類型符表示。字節(jié)類型是由編碼介于0~255之間的字符組成的序列,分為不可變字節(jié)類型和可變字節(jié)類型,分別用bytes類型符和bytearry符表示。在字符串前面加“b”可以定義bytes對象。bytes對象中的每一個字符可以是一個ASCII字符或\x00~\xff的十六進(jìn)制數(shù)。例如>>>by=b'abcd\x65'>>>byb'abcde'>>>type(by)<class'bytes'>5.4字節(jié)類型和字符串一樣,可以使用內(nèi)置的len()函數(shù)求bytes對象的長度,也可以使用“+”運(yùn)算符連接兩個bytes對象,其操作結(jié)果是一個新的bytes對象??梢允褂盟饕齺碓L問bytes對象中的某一個字符。對字符串做這種操作獲得的元素仍為字符串,而對bytes對象做這種操作的返回值則為整數(shù)。此外,bytes對象是不可改變的,不能對其賦值。如果需要改變某個字節(jié),可以組合使用字符串的分片和連接操作(效果跟字符串是一樣的),也可以將bytes對象轉(zhuǎn)換為bytearray對象,bytearray對象是可以被修改的。字符串與字節(jié)類型之間存在聯(lián)系。bytes對象有一個decode()方法,它使用某種字符編碼作為參數(shù),然后依照這種編碼方式將bytes對象轉(zhuǎn)換為字符串,對應(yīng)地,字符串有一個encode()方法,它也使用某種字符編碼作為參數(shù),然后依照它將串轉(zhuǎn)換為bytes對象。5.5.1正則表達(dá)式元字符正則表達(dá)式由普通字符和元字符組成。普通字符是正常的文本字符,具有字符的本來含義。元字符(metacharacter)具有特定的含義,它使正則表達(dá)式具有通用的匹配能力。5.5正則表達(dá)式下面是一些常用的正則表達(dá)式例子。(1)匹配帳號是否合法(設(shè)帳號以字母開頭,允許字母、數(shù)字及下劃線,包括5~16個字符):^[a-zA-Z][a-zA-Z0-9_]{4,15}$。(2)匹配國內(nèi)電話號碼:\d{3}-\d{8}|\d{4}-\d{7},例如0746-4405222。(3)匹配QQ號(設(shè)QQ號從10000開始):[1-9][0-9]{4,}。(4)匹配身份證(設(shè)身份證為15位或18位):\d{15}|\d{18}。(5)匹配特定數(shù)字。^[1-9]\d*$:匹配正整數(shù)。^-[1-9]\d*$:匹配負(fù)整數(shù)。^-?[1-9]\d*$:匹配整數(shù)。(6)匹配特定字符串。^[A-Za-z]+$:匹配由26個英文字母組成的字符串。^[A-Z]+$:匹配由26個大寫英文字母組成的字符串。^[a-z]+$:匹配由26個小寫英文字母組成的字符串。^[A-Za-z0-9]+$:匹配由數(shù)字和26個英文字母組成的字符串。^\w+$:匹配由數(shù)字、26個英文字母或者下劃線組成的字符串。5.5.2正則表達(dá)式模塊1.生成正則表達(dá)式對象使用re模塊的一般步驟是先使用compile()函數(shù)將正則表達(dá)式的字符串形式編譯為正則表達(dá)式對象,然后使用正則表達(dá)式對象提供的方法進(jìn)行字符串處理。compile()函數(shù)的一般調(diào)用格式是:pile(pattern[,flag])其中,參數(shù)pattern是代表匹配模式的正則表達(dá)式。flag是匹配選項標(biāo)志。2.字符匹配和搜索1)match()函數(shù)如果沒有生成正則表達(dá)式對象,使用match()函數(shù)可以直接進(jìn)行正則表達(dá)式的匹配。該函數(shù)的調(diào)用格式是:re.match(pattern,string[,flag])其中參數(shù)pattern是代表匹配模式的正則表達(dá)式,string是要匹配的字符串,flag是匹配選項標(biāo)志,可取的值與compile()函數(shù)的匹配選項標(biāo)志相同。2)search()函數(shù)如果想要搜索整個字符串來尋找匹配,應(yīng)當(dāng)用search()函數(shù)。search()函數(shù)也有兩種調(diào)用格式:re.search(pattern,string[,flag])search(string[,pos[,endpos]])參數(shù)的含義與match()函數(shù)相同。在字符串中查找匹配正則表達(dá)式模式的位置,返回match對象,如果沒有找到匹配的位置,則返回None。3)findall()函數(shù)findall()函數(shù)搜索字符串,以列表形式返回全部能匹配正則表達(dá)式的子串。該函數(shù)也有兩種調(diào)用格式。re.findall(pattern,string[,flag])findall(string[,pos[,endpos]])參數(shù)的含義與match()函數(shù)相同。4)finditer()函數(shù)findall()函數(shù)類似,在字符串中找到正則表達(dá)式所匹配的所有子串,并組成一個迭代器返回。該函數(shù)也有兩種調(diào)用格式。re.finditer(pattern,string[,flag])finditer(string[,pos[,endpos]])參數(shù)的含義與match()函數(shù)相同。3.字符替換re模塊的sub()函數(shù)、subn()函數(shù),或正則表達(dá)式對象的同名方法,使用正則表達(dá)式匹配字符串,用指定內(nèi)容替換結(jié)果,并返回替換后的字符串。sub()函數(shù)的兩種調(diào)用格式是:re.sub(pattern,repl,string[,count,flag])sub(repl,string[,count=0])該函數(shù)在字符串string中找到匹配正則表達(dá)式pattern的所有子串,用另一個字符串repl進(jìn)行替換。如果沒有找到匹配pattern的串,則返回未被修改的string。repl既可以是字符串也可以是一個函數(shù)。count用于指定最多替換次數(shù),不指定時全部替換。4.字符拆分re模塊的split()函數(shù)或正則表達(dá)式對象的同名方法,使用正則表達(dá)式匹配字符串,并拆分字符串,返回拆分后的字符串列表。split()函數(shù)的兩種調(diào)用格式是:re.split(pattern,string[,maxsplit,flag])split(string[,maxsplit])其中參數(shù)maxsplit用于指定最大拆分次數(shù),不指定將全部拆分。5.escape()函數(shù)re模塊還提供了一個escape(string)函數(shù),用于將string中的正則表達(dá)式特殊字符之前加上轉(zhuǎn)義符再返回。如果字符串很長且包含很多特殊字符,為避免輸入大量反斜杠,可以使用這個函數(shù)。5.6字符串應(yīng)用舉例例5-11輸入一個字符串,每次去掉最后面的字符并輸出。程序如下:s=input()foriinrange(-1,-len(s),-1):print(s[:i])例5-12翻譯密碼。分析:依次取電文中的字符,對其中的字母進(jìn)行處理,對字母之外的字符維持原樣。取字母的ASCII代碼,加上5,再按其ASCII碼轉(zhuǎn)換為另一個字母。還有一個問題要處理,當(dāng)字母為“V”時,加5就超過了“Z”,故應(yīng)使之轉(zhuǎn)換為“A”,同理,“W”→“B”,“X”→“C”,“Y”→“D”,“Z”→“E”。例5-13Python的標(biāo)識符以字母或下劃線(_)開頭,后接字母、數(shù)字或下劃線組成,從鍵盤輸入字符串,判斷它是否Python的標(biāo)識符。分析:利用string模塊中的常量,包括string.digits(數(shù)字0~9)、string.ascii_letters(所有大小寫字母)、string.ascii_lowercase(所有小寫字母)、string.ascii_uppercase(所有大寫字母)。先輸入字符串,再分別判斷首字符和中間字符,并給出提示。判斷中間字符利用for循環(huán)遍歷字符串。也可以構(gòu)造一個正則表達(dá)式來匹配所有合法的Python標(biāo)識符。例5-14從鍵盤輸入幾個數(shù)字,用逗號分隔,求這些數(shù)字之和。分析:輸入的數(shù)字當(dāng)作一個字符串來處理,首先分離出數(shù)字串,再轉(zhuǎn)換成數(shù)值,這樣就能求和。也可以使用正則表達(dá)式來實現(xiàn)。5.7.1網(wǎng)絡(luò)數(shù)據(jù)獲取1.?dāng)?shù)據(jù)采集與普通數(shù)據(jù)相比,網(wǎng)絡(luò)數(shù)據(jù)具有明顯的特點(diǎn),一是來源廣、數(shù)據(jù)量大、實時性和開放性強(qiáng),二是數(shù)據(jù)類型和語義豐富、弱規(guī)范性和非結(jié)構(gòu)化數(shù)據(jù)多。對于這類數(shù)據(jù),網(wǎng)絡(luò)爬蟲技術(shù)是一種重要的采集手段。5.7文本分析網(wǎng)絡(luò)爬蟲(Webcrawler)又稱為網(wǎng)絡(luò)蜘蛛(Webspider),是一種按照一定的規(guī)則自動抓取網(wǎng)頁信息的程序或腳本。網(wǎng)絡(luò)爬蟲的工作流程包括抓取網(wǎng)頁源代碼、解析網(wǎng)頁內(nèi)容、存儲數(shù)據(jù)等步驟。要抓取網(wǎng)頁通常有兩個庫,一個是Python內(nèi)置的urllib庫,一個是requests第三方庫。requests是一個第三方庫,先要進(jìn)行安裝,然后在Python環(huán)境下導(dǎo)入庫,再調(diào)用get()函數(shù)獲取到特定網(wǎng)頁的信息。2.信息提取通過調(diào)用requests庫函數(shù),可以得到網(wǎng)頁資源。此時,可以將其作為普通文本,采用正則表達(dá)式進(jìn)行信息提取。5.7.2中文分詞與詞頻統(tǒng)計文本分析的主要過程包括分詞、去停用詞、特征提取、建模分析等。1.分詞與分詞模式在Python中,可以利用第三方庫jieba來實現(xiàn)分詞操作。jieba支持以下三種分詞模式。(1)精確模式:將文本精確地分開,不存在冗余單詞,適合做文本分析。(2)全模式:把文本中所有可能的詞語都切分出來,存在冗余單詞。(3)搜索引擎模式:在精確模式的基礎(chǔ)上,對長詞再次進(jìn)行切分,適合用于搜索引擎分詞。2.詞頻統(tǒng)計詞頻統(tǒng)計是文本分析中常見的工作,它可以幫助了解文本中各個詞匯出現(xiàn)的頻率及其分布情況??梢允褂肞ython內(nèi)置庫collections中的Counter()函數(shù)進(jìn)行詞頻統(tǒng)計。Counter()函數(shù)統(tǒng)計列表中元素出現(xiàn)的次數(shù),返回一個字典,其中關(guān)鍵字是元素,值是元素出現(xiàn)的次數(shù)。還可以輸出詞頻最高的詞語。5.7.3中文詞云圖制作在Python中,可以通過第三方庫wordcloud來制作詞云圖,基本步驟如下。(1)安裝并導(dǎo)入wordcloud庫。(2)使用wordcloud庫的WordCloud()函數(shù)根據(jù)參數(shù)創(chuàng)建WordCloud對象。(3)使用WordCloud對象的generate(txt)方法將文本數(shù)據(jù)txt(會根據(jù)空格分詞)轉(zhuǎn)換為詞云圖。(4)使用WordCloud對象的to_file()方法將詞云圖保存為圖像文件(png或jpg格式)。例5-15新聞熱詞分析。對人民網(wǎng)()經(jīng)濟(jì)與科技專欄的信息進(jìn)行爬取,并分析其中的新聞熱詞,繪制詞云圖。分析:首先采用requests庫的get方法進(jìn)行資源獲取。由于這里僅進(jìn)行新聞熱詞分析,非中文字符沒有價值,可以將其全部剔除。然后進(jìn)行分詞。為排除干擾,仍然需要將沒有太大意義的單字符詞語去掉。最后繪制并顯示詞云圖。此外,使用背景圖片使得詞云更加美觀。第6章列表與元組序列的通用操作列表的專用操作元組與列表的比較序列的應(yīng)用6.1序列的通用操作6.1.1序列的索引與分片1.序列的索引序列中的每一個元素被分配一個位置編號,稱為索引(index)。第一個元素的索引為0,第二個元素的索引為1,依此類推。序列的元素可以通過索引進(jìn)行訪問,一般格式為:序列名[索引]例如:>>>greeting="hello">>>greeting[0]'H'除了常見的正向索引,Python序列還支持反向索引,即負(fù)數(shù)索引,可以從最后一個元素開始計數(shù),最后一個元素的索引是-1,倒數(shù)第二個元素的索引是-2,依此類推。使用負(fù)數(shù)索引,可以在無需計算序列長度的前提下很方便地定位序列中的元素。例如:>>>greeting[-1]'o'2.序列的分片分片(slice)就是取出序列中某一范圍內(nèi)的元素,從而得到一個新的序列。序列分片的一般格式為:序列名[起始索引:終止索引:步長]其中,起始索引是提取部分的第一個元素的編號,終止索引對應(yīng)的元素不包含在分片范圍內(nèi)。步長為非零整數(shù),當(dāng)步長為負(fù)數(shù)時,從右到左提取元素。當(dāng)忽略參數(shù)時,起始元素默認(rèn)為第一個,終止索引默認(rèn)為最后一個,步長默認(rèn)為1。例如:>>>number=[1,2,3,4,5,6,7,8,9,10]>>>number[3:6][4,5,6]>>>number[0:1][1]
注意:分片操作是產(chǎn)生新的序列,不會改變原來的序列。例如:>>>x=['a','b','c','d']>>>y=x[:]>>>id(x),id(y)(35812056,35833816)x[:]將產(chǎn)生一個新的列表,所以x和y代表不同的對象。而語句y=x則是給x的內(nèi)容再取一個名字y,也就是x和y都指向相同的存儲內(nèi)容,并沒有實現(xiàn)存儲內(nèi)容的真正的復(fù)制。看下面的語句。>>>x=['a','b','c','d']>>>y=x>>>id(x),id(y)(35812736,35812736)6.1.2序列的計算1.序列相加通過使用加號可以進(jìn)行序列的連接操作。例如:>>>[1,2,3]+[4,5,6][1,2,3,4,5,6]注意,只有兩種相同類型的序列才能進(jìn)行連接操作。2.序列相乘用整數(shù)n乘以一個序列會生成新的序列,在新序列中,原來的序列將重復(fù)n次。當(dāng)n<1時,將返回空列表。例如:>>>(42,)*5(42,42,42,42,42)>>>2*[1,2,3,4,5][1,2,3,4,5,1,2,3,4,5]3.序列比較兩個序列對象可以進(jìn)行比較操作,其規(guī)則是兩個序列的第一個元素先進(jìn)行比較,如果第1個元素可以得出結(jié)果,那么就得出序列比較結(jié)果。如果第一個元素一樣,則繼續(xù)比較下一個元素,如果元素本身也是序列,則對元素進(jìn)行以上過程。例如:>>>(1,2,3)<(1,2,4)True4.成員資格成員資格用于檢查一個值是否包含在某個序列中,Python使用in運(yùn)算符檢查元素的成員資格,并返回邏輯型的結(jié)果(True或False)。例如:>>>p=(1,2,3,4,5)>>>5inpTrue6.1.3序列處理函數(shù)1.len()、max()和min()函數(shù)len(s):返回序列中包含元素的個數(shù),即序列長度。min(s):返回序列中最小的元素。max(s):返回序列中最大的元素。2.sum()函數(shù)和reduce()函數(shù)sum(s):返回序列s中所有元素的和。要求元素必須為數(shù)值,否則出現(xiàn)TypeError錯誤。reduce(f,s[,n]):reduce()函數(shù)把序列s的前兩個元素作為參數(shù)傳給函數(shù)f,返回計算的結(jié)果和序列的下一個元素重新作為f的參數(shù),直到序列的最后一個元素。reduce()函數(shù)的返回值是函數(shù)f的返回值。在Python3.x中,reduce()函數(shù)已經(jīng)從全局名字空間中移出,放到了functools模塊中。如果需要,使用functools.reduce()調(diào)用格式。在Python2.x中,reduce是一個全局函數(shù),可直接調(diào)用。3.enumerate()和zip()函數(shù)enumerate(iter):接收一個可迭代對象作為參數(shù),返回一個enumerate對象,該對象生成由iter每個元素的索引值和元素值組成的元組。zip([s0,s1,……,sn]):接收任意多個序列作為參數(shù),返回一個可迭代對象,其第一個元素是s0,s1,……,sn這些元素的第一個元素組成的一個元組,后面的元素依次類推。若參數(shù)的長度不等,則返回列表的長度和參數(shù)中長度最短的對象相同。利用*號操作符,可以將對象解壓還原。4.sorted()函數(shù)和reversed()函數(shù)sorted(iterable,key=None,reverse=False):函數(shù)返回對可迭代對象iterable中元素進(jìn)行排序后的列表,函數(shù)返回副本,原始輸入不變。iterable是可迭代類型;key指定一個接收一個參數(shù)的函數(shù),這個函數(shù)用于計算比較的鍵值,默認(rèn)值為None;reverse代表排序規(guī)則,當(dāng)reverse為True時按降序排序;reverse為False時按升序,默認(rèn)按升序。reversed(iterable):對可迭代對象iterable的元素按逆序排列,返回一個新的可迭代變量。5.a(chǎn)ll()和any()函數(shù)設(shè)s為一個序列,下面的內(nèi)置函數(shù)可用于表、元組和字符串。all(s):如果序列s所有元素都為True,則返回True,否則返回False。any(s):如果序列任一元素為True,則返回True,否則返回False。6.1.4序列拆分賦值使用賦值語句,可以將序列賦給一個變量,也可以將序列拆分,賦給多個變量。例如:>>>x=[1,2,3,4]>>>x[1,2,3,4]>>>a,b,c,d=[1,2,3,4]>>>print(a,b,c,d)1234可以在變量名前面加星號(*),將序列的多個元素值賦給相應(yīng)的變量。例如:>>>a,*b,c=[1,2,3,4]>>>print(a,b,c)1[2,3]4>>>*a,b,c=[1,2,3,4]>>>print(a,b,c)[1,2]346.2列表的專有操作6.2.1列表的基本操作1.元素賦值使用索引編號來為某個特定的元素賦值,從而可以修改列表。例如:>>>x=[1,1,1]>>>x[1]=10>>>x[1,10,1]2.元素刪除從列表中刪除元素也很容易,使用del語句來實現(xiàn)。例如:>>>names=['Alice','Beth','Cecil','Jack','Earl']>>>delnames[2]>>>names['Alice','Beth','Jack','Earl']3.分片賦值使用分片賦值可以給列表的多個元素提示賦值。例如:>>>name=list('Perl')>>>name[2:]=list('ar')>>>name['P','e','a','r']4.列表解析在一個序列的值上應(yīng)用一個任意表達(dá)式,將其結(jié)果收集到一個新的列表中并返回。它的基本形式是一個中括號里面包含一個for語句對一個可迭代對象進(jìn)行迭代。例如:>>>[iforiinrange(8)][0,1,2,3,4,5,6,7]在列表解析中,可以增加測試語句和嵌套循環(huán)。一般形式如下:[表達(dá)式for目標(biāo)1in可迭代對象1[if條件1]……for目標(biāo)nin可迭代對象n[if條件n]]任意數(shù)量嵌套的for循環(huán)同時關(guān)聯(lián)可選的if測試,其中if測試語句是可選的,for上下之間表示的是一個嵌套關(guān)系。例如:>>>[(x,y)forxinrange(5)ifx%2==0foryinrange(5)ify%2==1][(0,1),(0,3),(2,1),(2,3),(4,1),(4,3)]6.2.2列表的常用方法1.適用于序列的方法s.count(x):返回x在序列s中出現(xiàn)的次數(shù)。例如:>>>x=[1,2,1,2,2]>>>x.count(2)3s.index(x):返回x在s中第一次出現(xiàn)的下標(biāo)。2.只適用于列表的方法s.append(x):在列表s的末尾附加x元素。例如:>>>lst=[1,2,3]>>>lst.append(4)>>>lst[1,2,3,4]s.extend(s1):在列表s的末尾添加列表s1的所有元素。s.sort():對列表s中的元素排序。s.reverse():將列表s中的元素逆序排列。s.pop([i]):刪除并返回列表s中指定位置i的元素,默認(rèn)是最后一個元素.若i超出列表長度,則拋出IndexError異常。s.insert(i,x):在列表s的i位置處插入x,如果i大于列表的長度,則插入到列表最后。s.remove(x):從列表s中刪除x,若x不存在,則拋出ValueError異常。6.3元組與列表的比較1.元組與列表的區(qū)別(1)元組是不可變的序列類型,元組能對不需要改變的數(shù)據(jù)進(jìn)行寫保護(hù),使數(shù)據(jù)更安全。列表是可變的序列類型,可以添加、刪除或搜索列表中的元素。(2)元組使用小括號定義用逗號分隔的元素,而列表中的元素應(yīng)該包括在中括號中。雖然元組使用小括號,但訪問元組元素時,要使用中括號按索引或分片來獲得對于元素的值。(3)元組可以在字典中當(dāng)作關(guān)鍵字使用,而列表不能當(dāng)作字典關(guān)鍵字使用,因為列表不是不可改變的。(4)只要不嘗試修改元組,那么大多數(shù)情況下把它們當(dāng)作列表來進(jìn)行操作。2.元組元素的可變性元組中的數(shù)據(jù)一旦定義就不允許更改,因此元組沒有append()方法、extend()方法或insert()方法,無法向元組中添加元素;元組也沒有pop()方法或remove()方法,不能從元組中刪除元素;元組也沒有sort()方法或reverse()方法,不能修改元組的值。刪除元組的元素是不可能的,但可以使用del語句刪除整個元組。3.元組與列表的轉(zhuǎn)換元組和列表可以通過list()函數(shù)和tuple()函數(shù)實現(xiàn)相互轉(zhuǎn)換。list()函數(shù)接收一個元組參數(shù),返回一個包含同樣元素的列表;tuple()函數(shù)接收一個列表參數(shù),返回一個包含同樣元素的元組。從實現(xiàn)效果上看,tuple()函數(shù)凍結(jié)列表,達(dá)到保護(hù)的目的,而list()函數(shù)融化元組,達(dá)到修改的目的。6.4序列的應(yīng)用6.4.1數(shù)據(jù)排序在Python中,數(shù)據(jù)排序可以直接使用sort方法或sorted()函數(shù),也可以自己編寫排序的程序。
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度餐飲行業(yè)冷鏈配送與質(zhì)量追溯體系合同3篇
- 鄭州科技學(xué)院《風(fēng)景人像基礎(chǔ)教程》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025版互聯(lián)網(wǎng)金融服務(wù)委托理財合同范本庫3篇
- 2025年行政合同簽訂及管理中行政優(yōu)先權(quán)的法律風(fēng)險防范指南2篇
- 美容院股份轉(zhuǎn)讓服務(wù)協(xié)議(2025版)2篇
- 二零二五版美容美發(fā)行業(yè)美容院品牌推廣服務(wù)合同4篇
- 2025年度個人反擔(dān)保協(xié)議樣本:教育機(jī)構(gòu)貸款融資專用4篇
- 2025版全面升級危險品物流運(yùn)輸合同范本3篇
- 西安市2025年度汽車租賃企業(yè)服務(wù)質(zhì)量評價體系3篇
- 2025年度菜鳥驛站綠色物流體系建設(shè)與推廣合同3篇
- 圓周率的認(rèn)識
- 基于SMT求解器的分支條件覆蓋測試
- 反騷擾政策程序
- 運(yùn)動技能學(xué)習(xí)與控制課件第十一章運(yùn)動技能的練習(xí)
- 射頻在疼痛治療中的應(yīng)用
- 四年級數(shù)學(xué)豎式計算100道文檔
- “新零售”模式下生鮮電商的營銷策略研究-以盒馬鮮生為例
- 項痹病辨證施護(hù)
- 懷化市數(shù)字經(jīng)濟(jì)產(chǎn)業(yè)發(fā)展概況及未來投資可行性研究報告
- 07FD02 防空地下室電氣設(shè)備安裝
- 教師高中化學(xué)大單元教學(xué)培訓(xùn)心得體會
評論
0/150
提交評論