04 組合數(shù)據(jù)類型_第1頁
04 組合數(shù)據(jù)類型_第2頁
04 組合數(shù)據(jù)類型_第3頁
04 組合數(shù)據(jù)類型_第4頁
04 組合數(shù)據(jù)類型_第5頁
已閱讀5頁,還剩70頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

組合數(shù)據(jù)類型04本章內(nèi)容組合數(shù)據(jù)類型概述列表元組集合字典可變類型與不可變類型淺拷貝與深拷貝Jieba庫的使用應(yīng)用實例組合數(shù)據(jù)類型能夠?qū)⒍鄠€同類型或不同類型的數(shù)據(jù)組織起來,通過單一的表示使數(shù)據(jù)操作更有序、更容易。組合數(shù)據(jù)類型可以容納批量數(shù)據(jù),因而也稱為容器數(shù)據(jù)類型。從是否有序這個角度來看,組合數(shù)據(jù)類型分為2類:序列類型和無序類型。序列類型是一個元素向量,元素之間存在先后關(guān)系,可通過序號訪問,Python提供的序列類型包括字符串、列表及元組。無序類型是一個元素集合體,元素之間沒有順序。Python提供的無序類型包括集合和字典類型。4.1組合數(shù)據(jù)類型概述組合數(shù)據(jù)類型可以分為可變類型和不可變類型。列表、字典和集合為可變類型,而字符串和元組屬于不可變類型。4.1組合數(shù)據(jù)類型概述對于序列類型,Python提供了12個通用的操作符和函數(shù)。4.1組合數(shù)據(jù)類型概述操作符描

述xins如果x是s的元素,返回True,否則返回Falsexnotins如果x不是s的元素,返回True,否則返回Falses+t連接s和ts*n或n*s將序列s復(fù)制n次s[i]索引,返回序列的第i個元素s[i:j]切片,返回包含序列s第i到j(luò)個元素的子序列(不包含第j個元素)s[i:j:k]規(guī)律切片,返回包含序列s第i到j(luò)個元素以k為步長的子序列l(wèi)en(s)序列s的元素個數(shù)(長度)min(s)序列s中的最小元素max(s)序列s中的最大元素s.index(x[,i[,j]])序列s中從i開始到j(luò)位置中第一次出現(xiàn)元素x的位置s.count(x)序列s中出現(xiàn)x的總次數(shù)4.2列表列表類型的概念列表的創(chuàng)建與刪除列表元素的切片、訪問和計數(shù)列表元素的添加、修改和刪除列表排序列表其他的常用操作列表生成式列表由一系列按特定順序排列的元素組成。在形式上,列表的所有元素放在一對方括號中,相鄰元素之間使用英文半角逗號分隔開。[1,2,3,4,5]['tom','jack','john','marry'][1,'python',2.0,[10,20]][[1,3,5],[2,4,6]]列表存放在有序連續(xù)內(nèi)存空間,當(dāng)列表增加或刪除元素時,列表對象自動進(jìn)行內(nèi)存的擴展或收縮,從而保證元素之間沒有縫隙。4.2.1列表類型的概念使用賦值運算符“=”直接將一個列表賦值給變量即可創(chuàng)建列表對象。也可以使用list()函數(shù)將元組、range對象、字符串或其他類型的可迭代對象轉(zhuǎn)換為列表。4.2.2列表的創(chuàng)建與刪除>>>a_list=['a','b','c','jxufe']>>>a_list['a','b','c','jxufe']>>>a_list=[]#創(chuàng)建空列表>>>a_list=list((1,3,5,7))#將元組轉(zhuǎn)換成列表類型>>>a_list[1,3,5,7]>>>list(range(1,10,2))[1,3,5,7,9]>>>list('hellochina!')['h','e','l','l','o','','c','h','i','n','a','!']>>>a=list()#創(chuàng)建空列表,a的值為[]當(dāng)某列表變量不再使用時,可使用del命令刪除該列表變量。從上述代碼運行結(jié)果可知,刪除列表對象a_list之后,該對象就不存在了,再次訪問時將拋出異常NameError提示訪問的對象名不存在。4.2.2列表的創(chuàng)建與刪除>>>a_list=[1,2]>>>a_list[1,2]>>>dela_list>>>a_listTraceback(mostrecentcalllast):File"<pyshell#4>",line1,in<module>a_listNameError:name'a_list'isnotdefined列表元素的訪問可以使用下標(biāo)直接訪問列表中的元素。如果指定下標(biāo)不存在,則拋出異常提示下越界。使用方法同字符串索引。4.2.3列表元素的訪問、切片和計數(shù)>>>a_list=[1,2,3,4,8,9,10,11,12]>>>a_list[3]4>>>a_list[10]Traceback(mostrecentcalllast):File"<pyshell#11>",line1,in<module>a_list[10]IndexError:listindexoutofrange>>>name=['Tom','John','David']>>>name[-1]'David'>>>name[-1][-2]'i'列表元素的切片可以使用切片來截取列表中的任何部分,得到一個新列表,也可以通過切片來修改和刪除列表中的部分元素,甚至可以通過切片操作作為列表對象增加元素。4.2.3列表元素的訪問、切片和計數(shù)>>>a_list=[1,2,3,4,8,9,10,11,12]>>>a_list[:] #返回包含原列表中所有元素的新列表[1,2,3,4,8,9,10,11,12]>>>a_list[::-1] #返回包含原列表中所有元素的逆序列表[12,11,10,9,8,4,3,2,1]>>>a_list[::2] #隔一個取一個,獲取偶數(shù)位置的元素[1,3,8,10,12]>>>a_list[1::2] #隔一個取一個,獲取奇數(shù)位置的元素[2,4,9,11]>>>a_list[-3:8] #正負(fù)索引同時使用[10,11]>>>a_list[3:6] #指定切片的起始和結(jié)束位置[4,8,9]>>>a_list[10:] #切片起始位置大于列表長度,返回空列表[]列表元素的計數(shù)如果想知道指定元素在列表中出現(xiàn)的次數(shù),可以使用列表對象的count()方法進(jìn)行統(tǒng)計。4.2.3列表元素的訪問、切片和計數(shù)>>>a_list=[1,2,3,2,2,4,8,9,10,11,12]>>>a_list.count(2)3>>>b_list=['Tom','Jack','Tom','John','Susan']>>>b_list.count('Tom')2列表元素的添加可以使用+運算符來實現(xiàn)將元素添加到列表中的功能嚴(yán)格意義上來講,這并不是為列表添加元素,而是創(chuàng)建一個新列表,并將原列表中的元素和新元素依次復(fù)制到新列表的內(nèi)存空間。但由于涉及大量元素的復(fù)制,該操作速度較慢,在涉及大量元素添加時不建議使用這個方法。使用列表對象的append()方法,原地修改列表這是真正意義上的在列表尾部添加元素,速度較快,也是較好辦法,但要注意的通過這個方法每次只能增加一個元素且是在尾部。4.2.4列表元素添加、修改和刪除>>>a_list=[1,2,3]>>>a_list=a_list+[4,5]>>>a_list[1,2,3,4,5]>>>a_list=[1,2,3]>>>a_list.append(4)>>>a_list[1,2,3,4]列表元素的添加使用列表對象的extend()方法可以將另一個列表對象的所有元素添加到列表對象尾部。使用列表對象的insert()方法可以將元素添加到列表的指定位置。列表的insert()方法可以在列表的任意位置插入元素,insert(i,j)括號里包含有兩個參數(shù),i表示插入原列表元素位置,j代表插入的元素值。使用“*”運算符來擴展列表對象,將列表與整數(shù)相乘,生成一個新列表。4.2.4列表元素添加、修改和刪除>>>a_list=[1,3,5]>>>b_list=[2,4,6]>>>a_list.extend(b_list)>>>a_list[1,3,5,2,4,6]>>>a_list.extend([7,8])>>>a_list[1,3,5,2,4,6,7,8]>>>a_list=[1,3,5]>>>a_list.insert(1,999)>>>a_list[1,999,3,5]>>>a_list=[1,3,5]>>>a_list=a_list*3>>>a_list[1,3,5,1,3,5,1,3,5]列表元素的修改修改列表元素的語法與訪問列表元素的語法類似。要修改列表元素,可指定列表名和要修改的元素的位置下標(biāo),再指定該元素的新值。4.2.4列表元素添加、修改和刪除>>>name=['Tom','John','David']>>>name[0]="Jack">>>name['Jack','John','David']列表元素的刪除使用del命令刪除列表中的指定位置上的元素。使用列表的pop()方法刪除并指定(默認(rèn)為最后一個)位置上的元素,如果給定的元素的位置下標(biāo)超出了列表的范圍,則拋出異常。使用列表對象的remove()方法刪除首次出現(xiàn)的指定元素,如果列表中不存在要刪除的元素,則拋出異常。使用列表對象的clear()方法刪除所有元素。4.2.4列表元素添加、修改和刪除>>>a_list=[1,3,5]>>>dela_list[1]>>>a_list[1,5]>>>a_list=[1,3,5,7]>>>a_list.pop(2)5>>>a_list[1,3,7]>>>a_list.pop()7>>>a_list[1,3]>>>a_list=[1,3,5,7]>>>a_list.remove(3)>>>a_list[1,5,7]>>>a_list=[1,3,5,7]>>>a_list.clear()>>>a_list[]列表元素的添加、修改和刪除4.2.4列表元素添加、修改和刪除>>>a_list=[1,2,3,4,8,9,10,11,12]>>>a_list[3]#索引結(jié)果是單個元素4>>>a_list[3]=13>>>a_list[1,2,3,13,8,9,10,11,12]>>>a_list[3:4]#切片結(jié)果是列表[13]>>>a_list[3:4]=[]#元素13被空列表替換,即13被刪除>>>a_list[1,2,3,8,9,10,11,12]>>>a_list[3:3]=120#切片賦值單個元素報錯Traceback(mostrecentcalllast):File"<pyshell#13>",line1,in<module>a_list[3:3]=120TypeError:canonlyassignaniterable>>>a_list[3:3]=[120,130]#相當(dāng)于插入元素>>>a_list[1,2,3,120,130,8,9,10,11,12]>>>a_list[3]=20#更改單個元素>>>a_list[1,2,3,20,130,8,9,10,11,12]>>>a_list[3]=[120]#單個元素替換為列表>>>a_list[1,2,3,[120],130,8,9,10,11,12]>>>a_list[6:8][9,10]>>>a_list[6:8]=[9,9.5,10]#插入新元素9.5>>>a_list[1,2,3,[120],130,8,9,9.5,10,11,12]通過列表的sort()方法進(jìn)原地排序,該方法支持多種不同的排序方式。通過內(nèi)置函數(shù)sorted()對列表進(jìn)行排序,與列表對象的sort()方法不同,內(nèi)置函數(shù)sorted()返回新列表,并不對原列表進(jìn)行任何修改。通過列表對象的reverse()方法將原列表中所有元素進(jìn)行反向排序。4.2.5列表排序>>>a_list=[15,2,3,28,19,10,31,12]>>>a_list.sort()#默認(rèn)為升序排列>>>a_list[2,3,10,12,15,19,28,31]>>>a_list.sort(reverse=True)#降序排列>>>a_list[31,28,19,15,12,10,3,2]>>>a_list=[15,2,3,28,19,10,31,12]>>>sorted(a_list)[2,3,10,12,15,19,28,31]>>>b_list=sorted(a_list,reverse=True)>>>b_list[31,28,19,15,12,10,3,2]>>>a_list[15,2,3,28,19,10,31,12]>>>a_list.reverse()>>>a_list[12,31,10,19,28,3,2,15]max()、min()函數(shù)用于返回列表中所有元素的最大值和最小值sum()函數(shù)用于返回列表中所有元素之和len()函數(shù)用于返回列表中元素的個數(shù)enumerate()返回包含若干個下標(biāo)和值的迭代對象。4.2.6列表的其它常用操作>>>a_list=[15,2,3,28,19,10,31,12]>>>max(a_list)31>>>min(a_list)2>>>b_list=['Tom','Jack','Alice','John','Susan']>>>max(b_list)'Tom'>>>min(b_list)'Alice'>>>len(a_list)8>>>len(b_list)5>>>b_list=['Tom','Jack','Alice','John','Susan']>>>list(enumerate(b_list))[(0,'Tom'),(1,'Jack'),(2,'Alice'),(3,'John'),(4,'Susan')]>>>fori,jinenumerate(b_list): print("第{}個元素為:{}".format(i+1,j))第1個元素為:Tom第2個元素為:Jack第3個元素為:Alice第4個元素為:John第5個元素為:Susan成員測試運算符in可用于測試列表中是否包含某個元素4.2.6列表的其它常用操作>>>1in[2,1,3,5]True>>>2in["2",1,3,5]False例4-1:一個班有15名同學(xué),現(xiàn)在要將這些同學(xué)隨機分成三個小組,請編寫程序,完成隨機的分配。4.2.6列表的其它常用操作12345678910importrandomclass_teams=[[],[],[]]class_names=['查哲民','陳皓','陳旭','程文明','鄧付凡','董蘇萱','范和穎','范佳聰','何文彬','胡鵬','胡煬廣','華仕挺','黃祎慧','江昉潔','江升']fornameinclass_names:team_number=random.randint(0,2)class_teams[team_number].append(name)foriinclass_teams:print(i)>>>['范佳聰','胡煬廣','華仕挺','江升']['陳皓','陳旭','鄧付凡','范和穎','何文彬','胡鵬','黃祎慧','江昉潔']['查哲民','程文明','董蘇萱']列表生成式又叫列表推導(dǎo)式,是利用其它列表或可迭代對象創(chuàng)建新列表的一種方法,其代碼簡潔,具有很強的可讀性。4.2.7列表生成式>>>ls=[1,2,3,4,5]>>>[x*2forxinls]#計算列表元素的平方[2,4,6,8,10]>>>[i*3foriinrange(10)]#使用range()函數(shù)[0,3,6,9,12,15,18,21,24,27]>>>x=[random.randint(1,100)foriinrange(10)]#生成10個1-100之間的整數(shù)>>>x[42,86,67,1,61,93,44,11,14,43]>>>[iforiinxifi%2==0]#取出列表x中所有偶數(shù)[42,86,44,14]列表生成式又叫列表推導(dǎo)式,是利用其它列表或可迭代對象創(chuàng)建新列表的一種方法,其代碼簡潔,具有很強的可讀性。4.2.7列表生成式>>>y=['The','Python','Software','Foundation','is','the','organization','behind','Python']>>>[c.lower()forcinyiflen(c)>6]#找出列表y中長度大于6的字符串,并將這些字符串全部轉(zhuǎn)換為小寫字母['software','foundation','organization']>>>[j.lower()forcinyiflen(c)<5forjinc]#依次輸出長度小于5的字符串中的字符['t','h','e','i','s','t','h','e']4.3元組元組的定義及基本操作元組與列表的異同點生成器推導(dǎo)式元組(tuple)是序列類型中比較特殊的類型,它一旦創(chuàng)建就不能修改。在形式上,元組的所有元素放在一對圓括號中,元素之間用逗號分隔,但如果元組中只有一個元素則必須在最后增加一個逗號。4.3.1元組的定義及基本操作>>>a=(1,2,3) #直接把元組給賦值一個變量>>>type(a) #通過type()函數(shù)測試變量的類型<class'tuple'>>>>b=(1) #相當(dāng)于b=1 >>>type(b)<class'int'>>>>c=(1,) #一個元素的元組則必須在最后增加一個逗號>>>type(c)<class'tuple'>>>>d=() #定義一個空元組>>>type(d)<class'tuple'> >>>d=tuple() #定義一個空元組另一種方法>>>type(d)<class'tuple'>元組(tuple)是序列類型中比較特殊的類型,它一旦創(chuàng)建就不能修改。在形式上,元組的所有元素放在一對圓括號中,元素之間用逗號分隔,但如果元組中只有一個元素則必須在最后增加一個逗號。4.3.1元組的定義及基本操作>>>a[1]=88 #元組是不可變的錯誤提示信息如下:Traceback(mostrecentcalllast):File"<pyshell#98>",line1,in<module>a[1]=88TypeError:'tuple'objectdoesnotsupportitemassignment>>>a=(1,2,3) #定義一個元組>>>a+=(4,)#雖不能修改元組元素,但給元組變量重新賦值合法>>>a(1,2,3,4)>>>x=tuple(range(3)) #將其他的迭代對象轉(zhuǎn)換為元組>>>print(x)(0,1,2)>>>print(type(x))<class'tuple'>元組(tuple)是序列類型中比較特殊的類型,它一旦創(chuàng)建就不能修改。在形式上,元組的所有元素放在一對圓括號中,元素之間用逗號分隔,但如果元組中只有一個元素則必須在最后增加一個逗號。元組屬于不可變序列,不可以直接修改元組中元素的值,也無法為元組增加或刪除元素。元組沒有提供append()、extend()和insert()等方法,無法向元組中添加元素;同樣,元組也沒有remove()和pop()等方法,也不支持對元組元素進(jìn)行刪除操作,而只能用del命令刪除整個元組。元組也支持切片操作,但是只能通過切片來訪問元組中的元素,而不允許使用切片來修改元組中元素的值,也不支持使用切片操作來為元組增加或刪除元素。Python的內(nèi)部實現(xiàn)對元組做了大量優(yōu)化,訪問速度比列表更快。如果定義了一系列常量值,主要用途僅是對它們進(jìn)行遍歷或其他類似用途,而不需要對其元素進(jìn)行任何修改,那么建議使用元組而不用列表。4.3.2元組與列表的異同點生成器推導(dǎo)式的語法與列表生成式非常相似,在形式上使用圓括號作為定界符,而不是使用列表生成式所使用的方括號。生成器推導(dǎo)式的結(jié)果是一個生成器對象。使用它可以迭代龐大的序列,且不需要在內(nèi)存創(chuàng)建和存儲整個序列。因為它的工作方式是每次處理一個對象,而不是一口氣處理和構(gòu)造整個數(shù)據(jù)結(jié)構(gòu)。生成器推導(dǎo)式?jīng)]有任何方法可以再次訪問已訪問過的元素,也不支持使用下標(biāo)或切片訪問其中的元素。4.3.3生成器推導(dǎo)式4.3.3生成器推導(dǎo)式>>>a=list(range(10))>>>a[0,1,2,3,4,5,6,7,8,9]>>>b=(i*iforiina)#構(gòu)造生成器推導(dǎo)式>>>b#查看生成器<generatorobject<genexpr>at0x00000246CADDF2A0>>>>tuple(b)#遍歷生成器并得到元組(0,1,4,9,16,25,36,49,64,81)>>>list(b)#生成器已經(jīng)遍歷結(jié)束,沒有元素了[]4.4集合集合對象的創(chuàng)建與刪除集合操作與運算集合生成式集合(set)類型與數(shù)學(xué)中集合的概念一致,即包含0個或多個數(shù)據(jù)項的無序組合,使用一對花括號作為定界符,元素之間使用逗號分隔。集合中的元素不可重復(fù),元素類型只能是固定數(shù)據(jù)類型,例如整數(shù)、浮點數(shù)、字符串、元組等,列表、字典和集合類型本身都是可變數(shù)據(jù)類型,不能作為集合的元素出現(xiàn)。集合元素是無序的,集合的實際打印效果與當(dāng)時定義的順序可以不一致。4.4集合直接將集合賦值給變量即可創(chuàng)建一個集合對象??梢允褂胹et()函數(shù)將列表、元組、字符串、range對象等其他可迭代對象轉(zhuǎn)換為集合,如果原來的數(shù)據(jù)中存在重復(fù)元素,則在轉(zhuǎn)換為集合的時候只保留一個。4.4.1集合對象的創(chuàng)建與刪除>>>a_set={1,2,3}#創(chuàng)建集合對象>>>type(a_set) #查看對象類型<class'set'>>>>a_set=set(range(1,9,2))#把range對象轉(zhuǎn)換為集合>>>a_set{1,3,5,7}>>>b_set={1,2,3,1,2,0}#集合會自動去掉重復(fù)元素>>>b_set{0,1,2,3}>>>c_set={} #不能用這種方法設(shè)置空集合>>>type(c_set)<class'dict'> #表示這個為字典類型>>>c_set=set()#空集合的設(shè)置方法>>>c_setset() #空集合>>>type(c_set)<class'set'>>>>a_set={1,3,5,7}>>>dela_set 用del命令刪除集合變量>>>a_setTraceback(mostrecentcalllast):File"<pyshell#22>",line1,in<module>a_setNameError:name'a_set'isnotdefined增加與刪除集合元素add()方法可以增加新元素,如果該元素已存在則忽略該操作,不會拋出異常update()方法合并另外一個集合中的元素到當(dāng)前集合中,并自動去除重復(fù)元素pop()方法隨機刪除并返回集合中的一個元素,如果集合為空則拋出異常remove()方法刪除集合中的元素,如果指定元素不存在則拋出異常discard()方法刪除集合中的元素,如果指定元素不存在,不報錯,但無任何輸出clear()方法清空集合4.4.2集合操作與運算>>>a_set{3,5,7}>>>a_set={1,3,5,7}>>>a_set.remove(3)#刪除集合中的元素“3”>>>a_set{1,5,7}>>>a_set.clear() #清空集合>>>a_setset()>>>s={1,2,3}>>>s.add(4)

#增加元素,如有重復(fù)元素自動忽略>>>s{1,2,3,4}>>>s.update({5,6})#合并另外一個集合元素到當(dāng)前集合>>>s{1,2,3,4,5,6}>>>a_set={1,3,5,7}>>>a_set.pop()#隨機刪除并返回集合中的一個元素1集合運算內(nèi)置函數(shù)len()、max()、sum()等也適用于集合通過“in”和“notin”判斷集合是不包含某元素4.4.2集合操作與運算>>>a_set={8,9,10,11,12,13}>>>len(a_set) #測試集合元素的個數(shù)6>>>max(a_set) #集合元素的最大值13>>>min(a_set) #集合元素的最小值8>>>sum(a_set) #集合所有元素之和63>>>max({'Harry','Tom','Hugo'})'Tom'>>>min({'Harry','Tom','Hugo'})'Harry'>>>"Tom"in{'Harry','Tom','Hugo'}#元素是否在集合之中True集合運算Python集合還支持?jǐn)?shù)學(xué)意義的交集、并集、差集、補集等運算4.4.2集合操作與運算操作符描

述S-T或S.difference(T)返回一個新集合,包括在集合S中但不在集合T中的元素S-=T或S.difference_update(T)更新集合S,包括在集合S中但不在集合T中的元素S&T或S.intersection(T)返回一個新集合,包括同時在集合S和T中的元素S&=T或S.intersection_update(T)更新集合S,包括同時在集合S和T中的元素S^T或S.symmetric_difference(T)返回一個新集合,包括集合S和T中的元素,但不包括同時在其中的元素S=^T或s.symmetric_difference_update(T)更新集合S,包括集合S和T中的元素,但不包括同時在其中的元素S|T或S.union(T)返回一個新集合,包括集合S和T中的所有元素S|=T或S.update(T)更新集合S,包括集合S和T中的所有元素集合運算4.4.2集合操作與運算>>>a_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) #對稱差集{0,1,2,3,7,9,10,11,12,13}>>>a_set^b_set #對稱差集{0,1,2,3,7,9,10,11,12,13}集合生成式與列表生成式差不多,主要區(qū)別在于,集合生成式采用花括號且結(jié)果中無重復(fù)元素,而列表生成式使用方括號、結(jié)果允許存在重復(fù)值。4.4.3集合生成式>>>y=['The','Python','Software','Foundation','is','the','organization','behind','Python']>>>y['The','Python','Software','Foundation','is','the','organization','behind','Python']>>>{j.lower()forcinyiflen(c)>6forjinc}#重復(fù)的字符只顯示一次{'w','e','g','o','u','r','n','s','d','t','a','f','i','z'}4.5字典字典的創(chuàng)建與刪除字典元素的訪問與修改字典類型的常用操作字典生成式字典(dict)是包含若干“鍵:值”元素的無序可變對象,即字典的每個元素都包含用冒號分隔開的“鍵”和“值”兩部分,表示為一種映射或?qū)?yīng)關(guān)系,元素之間是無序的,不同元素之間用逗號隔開,所有的元素放在一對花括號“{}”中。從Python設(shè)計角度考慮,由于花括號“{}”也可以表示集合,因此字典類型也具有和集合類似的性質(zhì),即鍵值對之間沒有順序且不能重復(fù)。簡單說,可以把字典看成元素是鍵值對的集合。4.5字典使用賦值運算符“=”將使用{}括起來的“鍵:值”對賦值給一個字典變量即可創(chuàng)建一個字典變量。字典中元素的鍵可以是Python中任意不可變數(shù)據(jù),如整數(shù)、實數(shù)、復(fù)數(shù)、字符串、元組等類型的可哈希數(shù)據(jù),但不能使用列表、集合、字典或其它可變類型作為字典的鍵。字典中不允許出現(xiàn)相同的鍵,但不同鍵允許對應(yīng)相同的值。如果定義字典時,存在鍵相同的多個鍵值對,則這多個鍵值對中只有一個鍵值對被保留。4.5.1字典的創(chuàng)建與刪除>>>city={"江西":"南昌","江蘇":"南京","湖北":"武漢"}>>>print(city) #打印輸出字典變量{'江西':'南昌','江蘇':'南京','湖北':'武漢'}可以使用字典的析構(gòu)方法dict(),利用二元組序列創(chuàng)建字典??梢酝ㄟ^關(guān)鍵參數(shù)創(chuàng)建字典。使用zip()創(chuàng)建字典。zip()函數(shù)將多個可迭代對象中對應(yīng)的元素打包成一個個元組,然后返回一個可迭代對象。若zip()函數(shù)中各參數(shù)元素個數(shù)不一致,則返回對象的長度與最短的對象相同。4.5.1字典的創(chuàng)建與刪除>>>items=[('a',1),('b',2),('c',3)]>>>a_dict=dict(items)>>>a_dict{'a':1,'b':2,'c':3}>>>b_dict=dict(a=1,b=2,c=3)>>>b_dict{'a':1,'b':2,'c':3}>>>key='abc'>>>value=range(1,4)>>>c_dict=dict(zip(key,value))#>>>c_dict{'a':1,'b':2,'c':3}使用dict()可以定義一個空字典,

使用del命令能夠刪除字典對象。4.5.1字典的創(chuàng)建與刪除>>>a_dict=dict()>>>a_dict{}>>>type(a_dict)#為空字典<class'dict'>>>>a={}#花括號定義為空字典,不是空集合>>>type(a)#為空字典<class'dict'>>>>dela_dict>>>a_dictTraceback(mostrecentcalllast):File"<pyshell#3>",line1,in<module>a_dictNameError:name'a_dict'isnotdefined.Didyoumean:'dict'?字典最主要的用法是查找與特定鍵相對應(yīng)的值,可通過索引實現(xiàn)。編程語言的索引主要包括兩類:數(shù)字索引,也稱為位置索引;另一類為字符索引。數(shù)字索引采用數(shù)字序號找到內(nèi)容。字符索引采用字符作為索引詞找到數(shù)據(jù)。Python語言中,字符串、列表、元組等都采用數(shù)字索引,字典采用字符索引。一般來說,通過“字典變量[key]”的方式訪問鍵對應(yīng)的值。4.5.2字典的訪問與修改>>>city={"江西":"南昌","江蘇":"南京","湖北":"武漢"}>>>city["江西"]'南昌'字典中對某個鍵值的修改或增加新元素都可以通過中括號的訪問和賦值實現(xiàn)。當(dāng)以指定鍵作為索引為字典元素賦值時,有兩種含義若該鍵存在,則表示修改改鍵對應(yīng)的值若該鍵不存在,則表示為字典新增一個元素,即一個“鍵:值”對4.5.2字典的訪問與修改>>>city["江西"]="南昌市" #修改字典元素>>>city{'江西':'南昌市','江蘇':'南京','湖北':'武漢'}>>>city["福建"]="福州" #增加字典新元素>>>city{'江西':'南昌市','江蘇':'南京','湖北':'武漢','福建':'福州'}可通過keys()、values()和items()方法可以返回字典所有的鍵、值或字典條目的相關(guān)信息。4.5.2字典的訪問與修改>>>city.keys()dict_keys(['江西','江蘇','湖北'])>>>city.values()dict_values(['南昌','南京','武漢'])>>>city.items()dict_items([('江西','南昌'),('江蘇','南京'),('湖北','武漢')])>>>list(city.items())[('江西','南昌'),('江蘇','南京'),('湖北','武漢')]可以通過for-in語句對其元素或各元素的鍵、值進(jìn)行遍歷。4.5.2字典的訪問與修改>>>foriincity.keys(): print(i)

江西江蘇湖北>>>foriincity.values():print(i)

南昌南京武漢>>>foriincity.items():print(i)

('江西','南昌')('江蘇','南京')('湖北','武漢')4.5.3字典類型的常用操作函數(shù)或方法描

述d.get(<key>,<default>)鍵存在則返回相應(yīng)值,否則返回默認(rèn)值d.pop(<key>,<default>)鍵存在則返回相應(yīng)值,同時刪除鍵值對,否則返回默認(rèn)值d.popitem()隨機從字典中取出一個鍵值對,以元組(key,value)形式返回d.clear()刪除所有的鍵值對Deld[<key>]刪除字典或字典中某一個鍵值對<key>ind如果鍵在字典中則返回True,否則返回Falsesorted(d)將字典的鍵排序后以列表形式返回,字典自身不變4.5.3字典類型的常用操作>>>city={"江西":"南昌","江蘇":"南京","湖北":"武漢"}>>>sorted(city,reverse=True)#將字典的鍵按Unicode值降序排序后輸出['湖北','江西','江蘇']>>>city.get("福建","福州") #"福建"在字典中不存在'福州'>>>city.get("江蘇","福州") #"江蘇"在字典中存在'南京'>>>city={"江西":"南昌","江蘇":"南京","湖北":"武漢"}>>>city.pop('江西',"九江") #"江西"在字典中存在'南昌'>>>city #"江西"這個字典元素刪除了{(lán)'江蘇':'南京','湖北':'武漢'}>>>delcity['江蘇'] #"江蘇"這個字典元素刪除了4.5.3字典類型的常用操作>>>city{'湖北':'武漢'}>>>'武漢'incity #判斷'武漢'這個鍵是否在字典中存在False>>>'湖北'incity #判斷'湖北'這個鍵是否在字典中存在True>>>city.clear() #刪除所有的鍵值對>>>city{}>>>delcity#刪除字典,內(nèi)存中已經(jīng)釋放>>>cityTraceback(mostrecentcalllast):File"<pyshell#48>",line1,in<module>cityNameError:name'city'isnotdefined字典生成式和列表生成式的使用方法類似,只是把方括號改成了花括號。4.5.4字典生成式>>>dt={'Aa':1,'Bb':3,'Cc':5}>>>{k.lower():v*2fork,vindt.items()}#將鍵轉(zhuǎn)換為小寫、值變成2倍{'aa':2,'bb':6,'cc':10}4.6可變類型與不可變類型不可變數(shù)據(jù)類型可變數(shù)據(jù)類型可變類型與不可變類型的分類不可變數(shù)據(jù)類型在第一次聲明賦值的時候,會在內(nèi)存中開辟一塊空間,用來存放這個變量被賦的值,而這個變量實際上存儲的,并不是被賦予的這個值,而是存放這個值所在空間的內(nèi)存地址,通過這個地址,變量就可以在內(nèi)存中取出數(shù)據(jù)了。所謂不可變,即我們不能改變這個數(shù)據(jù)在內(nèi)存中的值,所以當(dāng)我們改變這個變量的賦值時,只是在內(nèi)存中重新開辟了一塊空間,將一條新的數(shù)據(jù)存放在一個新的內(nèi)存地址里,而這個變量就不再引用原數(shù)據(jù)的內(nèi)存地址,而轉(zhuǎn)為引用新數(shù)據(jù)的內(nèi)存地址。4.6.1不可變數(shù)據(jù)類型4.6.1不可變數(shù)據(jù)類型>>>x=18>>>id(x)#獲取對象的內(nèi)存地址4497811200>>>id(18)4497811200>>>x=19>>>id(x)4497811232>>>id(18)4497811200>>>y=18>>>id(y) 4497811200x=19y=18x=18yxx4497811200

44978112004497811232181918可變數(shù)據(jù)類型是指變量所指向的內(nèi)存地址處的值是可以被改變的。不可變數(shù)據(jù)類型:當(dāng)該數(shù)據(jù)類型的對應(yīng)變量的值發(fā)生了改變,那么它對應(yīng)的內(nèi)存地址也會發(fā)生改變,對于這種數(shù)據(jù)類型,稱為不可變數(shù)據(jù)類型??勺償?shù)據(jù)類型:當(dāng)該數(shù)據(jù)類型的對應(yīng)變量的值發(fā)生了改變,那么它對應(yīng)的內(nèi)存地址不發(fā)生改變,對于這種數(shù)據(jù)類型,就稱可變數(shù)據(jù)類型。4.6.2可變數(shù)據(jù)類型4.6.2可變數(shù)據(jù)類型>>>x=[1,2,3]>>>id(x)4501838920>>>y=[1,2,3]>>>z=[1,2,3]>>>id(y)4501838600>>>id(z)4501838664>>>x.append(4)>>>id(x)4501838920>>>x[1,2,3,4]不可變類型:Number(數(shù)字)、String(字符串)、Tuple(元組)。當(dāng)整數(shù)變量和字符串變量的值發(fā)生變化時,其對應(yīng)內(nèi)存地址也發(fā)生了改變,因而他們都是不可變數(shù)據(jù)類型。4.6.3可變類型和不可變類型的分類>>>a=1#整數(shù)>>>print(id(a),type(b))1491617424<class'int'>>>>a=2>>>print(id(a),type(b))1491617440<class'int'>>>>b="jxufe"#字符串>>>print(id(b),type(b))46252832<class'str'>>>>b="xjg.jxufe">>>print(id(b),type(b))31752664<class'str'>>>>c1=['1','2']>>>c=(1,2,c1)>>>print(c,id(c),type(c))(1,2,['1','2'])4363948248<class'tuple'>>>>c1[1]='djx'>>>print(c,id(c),type(c))(1,2,['1','djx'])4363948248<class'tuple'>可變類型:Set(集合)、List(列表)、Dictionary(字典)。4.6.3可變類型和不可變類型的分類>>>s={1,'d','34','1',1}#集合>>>print(s,type(s),id(s)){1,'1','d','34'}<class'set'>4401385256>>>s.add('djx')>>>print(s,type(s),id(s)){1,'1','34','d','djx'}<class'set'>4401385256>>>list=[1,'q','qwer',True]#列表>>>print(list,type(list),id(list))[1,'q','qwer',True]<class'list'>4401113608>>>list.append('djx')>>>print(list,type(list),id(list))[1,'q','qwer',True,'djx']<class'list'>4401113608>>>tuple=1>>>d={tuple:1,'key2':'djx','key3':'li'}>>>print(d,type(d),id(d)){1:1,'key2':'djx','key3':'li'}<class'dict'>4401075976>>>d['key4']='haha'>>>print(d,type(d),id(d)){1:1,'key2':'djx','key3':'li','key4':'haha'}<class'dict'>44010759764.7淺拷貝和深拷貝淺拷貝深拷貝淺拷貝是在賦值時開辟新的存儲空間來保存新對象。a和b是一個獨立的對象,但他們的子對象還是指向統(tǒng)一對象(是引用)。淺拷貝后,改變原始對象中為可變類型的元素的值,會同時影響拷貝對象;改變原始對象中為不可變類型的元素的值,不會影響拷貝對象。4.7.1淺拷貝>>>a=[[1,2],'fei',90]

>>>b=a.copy()#淺拷貝

>>>aisb#判斷對象地址是否相同F(xiàn)alse >>>print(id(a),id(b))13318960048641331896000960>>>a[0]isb[0]#判斷第一個元素地址是否相同True >>>a[1]isb[1]#判斷第二個元素地址是否相同True

>>>a[0][0]=2#改變第一個可變類型的值>>>a[[2,2],'fei',90] >>>b#復(fù)制對象也跟著改變了[[2,2],'fei',90] >>>a[1]='anne'#改變第二個不可變類型的值>>>a[[2,2],'anne',90] >>>b#復(fù)制對象沒有改變[[2,2],'fei',90]在復(fù)制時對所有對象都要生成拷貝的方式。a和b完全拷貝了父對象及其子對象,兩者是完全獨立的。深拷貝,除了頂層拷貝,還對子元素也進(jìn)行了拷貝。經(jīng)過深拷貝后,原始對象和拷貝對象所有的可變元素地址都沒有相同的了。4.7.2深拷貝>>>importcopy>>>a=[[1,2],'fei',90]

>>>c=copy.deepcopy(a)>>>aisc#判斷對象地址是否相同F(xiàn)alse>>>a[0]isc[0]#判斷第一個元素地址是否相同F(xiàn)alse >>>a[1]isc[1]#判斷第二個元素地址是否相同True >>>a[0][0]=2#改變第一個元素,查看復(fù)制元素變化>>>a[[2,2],'fei',90]>>>c#復(fù)制元素不變,對復(fù)制元素沒影響[[1,2],'fei',90]>>>a[1]='Anne'#改變第二個元素>>>a[[2,2],'Anne',90]>>>c#復(fù)制元素不變,對復(fù)制元素沒影響[[1,2],'fei',90]

4.8jieba庫的使用jieba庫概述jieba庫解析jieba是Python中一個重要的第三方中文分詞函數(shù)庫。對于一段英文文本,例如"Chinaisagreatcountry",如果希望提取其中的單詞,只需要使用字符串處理的split方法即可對于一段中文文本,例如,"中國是一個偉大的國家”,獲得其中的單詞(不是字符)十分困難,因為英文文本可以通過空格或者標(biāo)點符號分隔,而中文單詞之間缺少分隔符,這是中文及類似語言獨有的“分詞”問題。"中國是一個偉大的國家"分為"中國”、"是”、"ー個”、"偉大”、"的”、"國家”等一系列詞語。4.8.1jieba庫概述>>>"Chinaisagreatcountry".split()['China','is','a','great','country']jieba中文分詞應(yīng)用舉例jieba庫是第三方庫,不是Python安裝包自帶的,因此,需要通過pip指令安裝4.8.1jieba庫概述>>>importjieba>>>jieba.lcut("中國是一個偉大的國家")['中國','是','一個','偉大','的','國家']jieba庫的分詞原理是利用一個中文詞庫,將待分詞的內(nèi)容與分詞詞庫進(jìn)行比對,通過圖結(jié)構(gòu)和動態(tài)規(guī)劃方法找到最大概率的詞組。除了分詞,jieba還提供自定義中文單詞的功能。jieba庫支持3種分詞模式精確模式,將句子最精確地切開,適合文本分析全模式,把句子中所有可以成詞的詞語都掃描出來,速度非常快,但是不能消除歧義搜索引擎模式,在精確模式的基礎(chǔ)上,對長詞再次切分,提高召回率,適合用于搜索引擎分詞4.8.1jieba庫概述jieba庫主要提供分詞功能,可以輔助自定義分詞詞典。jieba庫中包含的主要函數(shù)如下:4.8.2jieba庫解析函

數(shù)描

述jieba.lcut(s)精確模式,返回一個列表類型,建議使用jieba.lcut(s,cut_all=True)全模式,返回一個列表類型,建議使用jieba.lcut_for_search(s)搜索引擎模式,返回一個列表類型,建議使用jieba.add_word(w)向分詞詞典中增加新詞jieba分詞函數(shù)應(yīng)用jieba.lcut()函數(shù)返回精確模式,輸出的分詞完整且不多余地組成原始文本jieba.lcut(s,True)函數(shù)返回全模式,輸出原始文本中可能產(chǎn)生的所有詞匯,冗余性最大jieba.lcut_for_search()函數(shù)返回搜索引擎模式,該模式首先執(zhí)行精確模式,然后再對其中的長詞進(jìn)一步切分獲得結(jié)果4.8.2jieba庫解析>>>importjieba>>>jieba.lcut("中華人民共和國是一個偉大的國家")['中華人民共和國','是','一個','偉大','的','國家']>>>jieba.lcut("中華人民共和國是一個偉大的國家",cut_all=True)['中華','中華人民','中華人民共和國','華人','人民','人民共和國','共和','共和國','國是','一個','偉大','的','國家']>>>jieba.lcut_for_search("中華人民共和國是一個偉大的國家")['中華','華人','人民','共和','共和國','中華人民共和國','是','一個','偉大','的','國家']增加新詞對于無法識別的分詞,也可以通過jieba.add_word()函數(shù)向分詞庫添加4.8.2jieba庫解析>>>importjieba>>>jieba.lcut("小明參加云計算項目研究")['小明','參加','云','計算','項目','研究']>>>jieba.add_word("云計算")>>>jieba.lcut("小明參加云計算項目研究")['小明','參加','云計算','項目','研究']4.9應(yīng)用實例英文詞頻統(tǒng)計中文詞頻統(tǒng)計對于一篇給定文章,希望統(tǒng)計其中多次出現(xiàn)的詞語,進(jìn)而概要分析文章的內(nèi)容,甚至可能通以詞頻特性來判斷一個文體是否出自于同一位作者筆下。在對網(wǎng)絡(luò)信息進(jìn)行自動檢索和歸檔時,也會遇到同樣的問題。這就是“詞頻統(tǒng)計”問題。從思路上看,詞頻統(tǒng)計只是累加問題,即對文檔中每個詞設(shè)計一個計數(shù)器,詞語每出現(xiàn)一次,相關(guān)計數(shù)器加1。如果以詞語為鍵,計數(shù)器為值,構(gòu)成“<單詞>:<出現(xiàn)次數(shù)>”的鍵值對,將很好地解決該問題。這就是字典類型的優(yōu)勢。4.9應(yīng)用實例《飄》是美國作家瑪格麗特·米切爾創(chuàng)作的長篇小說。統(tǒng)計該文中每個英文單詞的出現(xiàn)次數(shù),從高到低輸出。第一步是讀取英文文本。第二步是分解并提取英文文章的單詞,注意不要區(qū)分單詞大小寫。第三步是統(tǒng)計每個單詞出現(xiàn)次數(shù)。第四部是從高到低輸出結(jié)果。4.9.1英文詞頻統(tǒng)計第一步是讀取英文文本,文件名為gone_with_the_wind(english).txt。第二步是分解并提取英文文章的單詞,注意不要區(qū)分單詞大小寫。第三步是統(tǒng)計每個單詞出現(xiàn)次數(shù)。4.9.1英文詞頻統(tǒng)計f=open('gone_with_the_wind(english).txt','r')#程序文件與英文文檔保存在同一個文件夾中txt=f.read()txt=txt.lowe

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論