Python程序設(shè)計基礎(chǔ)第五章 列表、元組與字典_第1頁
Python程序設(shè)計基礎(chǔ)第五章 列表、元組與字典_第2頁
Python程序設(shè)計基礎(chǔ)第五章 列表、元組與字典_第3頁
Python程序設(shè)計基礎(chǔ)第五章 列表、元組與字典_第4頁
Python程序設(shè)計基礎(chǔ)第五章 列表、元組與字典_第5頁
已閱讀5頁,還剩53頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

匯報人:WPSPython程序設(shè)計基礎(chǔ)第五章列表、元組與字典目錄01列表02列表元素的操作03元組04字典目錄05Python生態(tài)系統(tǒng)之jieba庫06小試牛刀07拓展實踐08本章小結(jié)

理解并掌握列表的使用方法。

理解元組與列表的區(qū)別。

理解并掌握字典的使用方法。了解jieba分詞庫的使用方法。Python

不僅提供了整型、浮點型等基本的數(shù)據(jù)類型,還提供了更復(fù)雜、功能強大的組合數(shù)據(jù)類

型,如列表、元組、字典等。當(dāng)程序要處理一系列彼此關(guān)聯(lián)非常密切的數(shù)據(jù)時,這些數(shù)據(jù)類型會給

程序的編寫帶來極大的方便。本章就來認(rèn)識一下列表、元組與字典。學(xué)習(xí)目標(biāo)PART15.1列表第

3

章在介紹

random

庫中的

sample()函數(shù)時提到,sample()將抽取的多個元素放置在一個列表中返回。第4

章介紹字符串的split()方法時提到,其分拆得到的多個字符串也被放置在一

個列表中。可見列表非常適合存放一系列的有關(guān)聯(lián)的數(shù)據(jù)。例如,中國有很多名山大川,它們不僅擁有優(yōu)美的景致,還有悠久的歷史文化。如果希望匯總一批名山的數(shù)據(jù),列表是一個很好的選擇。代碼

5.1

使用方括號定義了一個列表,其中有

5

個元素,元素間使用逗號分隔。從代碼注釋的

描述可知,列表中的元素可通過索引編號訪問,這一點與字符串很類似。列表開頭第一個元素的編

號為0,如果編號為負(fù)值,則表示從后向前數(shù)時元素的序號。除了可以可以通過索引編號輸出其中的元素,也可以輸出整個列表,注意輸出整個列表時結(jié)果帶有方括號。代碼

5.1

認(rèn)識列表5.1.1認(rèn)識列表print(mountains[0])#泰山print(mountains[1])#華山print(mountains[-1])#武當(dāng)山print(mountains)#['泰山','華山','黃山','峨眉山','武當(dāng)山']mountains=

["泰山","華山","黃山","峨眉山","武當(dāng)山"]通俗地講,列表有點類似調(diào)料盒??梢詫⒘斜硐胂蟪梢粋€擁有多個位置的容器,每個位置均可保存數(shù)據(jù)。列表中的數(shù)據(jù)可以是不同類型的,字符串、整型、浮點型等數(shù)據(jù)可同時存在于一個列表

中。例如,如果希望收集有關(guān)名山的更多數(shù)據(jù)而不僅僅只有名稱,則可以像代碼5.2

這樣做,其中

的數(shù)值代表山峰的海拔高度。代碼

5.2

列表可保存不同類型的數(shù)據(jù)。5.1.1認(rèn)識列表['泰山','玉皇頂',1532.7]['華山','南峰',2154.9]['武當(dāng)山','天柱峰',1612.1]mountains=

["泰山","玉皇頂",1532.7,

"華山","南峰",2154.9,"黃山","蓮花峰",1864.8,

"峨眉山","萬佛頂",3099.0,

"武當(dāng)山","天柱峰",1612.1]print(mountains[0:3])

print(mountains[3:6])

print(mountains[-3:])代碼

5.2

的運行結(jié)果如下,均為原列表的片段,對應(yīng)著不同的名山。#泰山信息

#華山信息

#武當(dāng)山信息由代碼

5.2可知,列表是一種比較靈活的數(shù)據(jù)結(jié)構(gòu),可將不同類型但有關(guān)聯(lián)的數(shù)據(jù)聚合在一起。

而且,列表也支持切片操作,規(guī)則和字符串是一致的。其實,列表的元素還可以是另一個列表,這

時就形成了列表嵌套的局面,下面看代碼

5.3

的演示。代碼

5.3

列表的嵌套5.1.1認(rèn)識列表這段代碼先定義了幾個小列表,分別保存各名山的數(shù)據(jù)。之后在定義mountains列表時,其元素是這些小列表,如此即形成列表的嵌套。這種寫法較之代碼5.2的優(yōu)勢在于,單獨訪問某一座名山的數(shù)據(jù)時更容易、更清晰。因為存在列表的嵌套,如果要通過

mountains列表訪問某一座山的分項數(shù)據(jù),如最高峰、海

拔等,則會出現(xiàn)類似

mountains[3][2]的寫法。其中,mountains[3]獲取列表

mountains

的第

4個元

素,而這個元素本身又是列表,因此

mountains[3][2]表示第

4

個元素即列表

e_mei_shan

的第

3

個元素。tai_shan=

["泰山","玉皇頂",1532.7]hua_shan=

["華山","南峰",2154.9]huang_shan=

["黃山","蓮花峰",1864.8]e_mei_shan=

["峨眉山","萬佛頂",3099.0]wu_dang_shan=

["武當(dāng)山","天柱峰",1612.1]mountains=

[tai_shan,hua_shan,huang_shan,e_mei_shan,wu_dang_shan]['泰山','玉皇頂',1532.7]['峨眉山','萬佛頂',3099.0]['武當(dāng)山','天柱峰',1612.1]峨眉山最高峰為萬佛頂,海拔

3099.0米。msg=mountains[3][0]+"最高峰為"+mountains[3][1]+

",海拔"

+

\

str(mountains[3][2])+

"米。"print(msg)print(mountains[0])

print(mountains[3])

print(mountains[-1])#泰山信息

#峨眉山信息

#武當(dāng)山信息代碼

5.3

的運行結(jié)果如下。列表不僅像字符串一樣可以使用索引序號、切片操作訪問元素,也可以使用循環(huán)語句遍歷其中

的各元素。使用

for循環(huán)遍歷列表,如代碼

5.4所示,可以看出與遍歷字符串很類似。代碼

5.4

使用

for

語句遍歷列表在循環(huán)過程中,mountains列表的每個元素值會依次被復(fù)制到循環(huán)變量

m

中。因此

m也是一個

列表,m[0]、m[1]、m[2]分別表示山名、最高峰和海拔。代碼

5.4

的運行結(jié)果如下。5.1.2遍歷列表tai_shan=

["泰山","玉皇頂",1532.7]hua_shan=

["華山","南峰",2154.9]huang_shan=

["黃山","蓮花峰",1864.8]e_mei_shan=

["峨眉山","萬佛頂",3099.0]wu_dang_shan=

["武當(dāng)山","天柱峰",1612.1]mountains=

[tai_shan,hua_shan,huang_shan,e_mei_shan,wu_dang_shan]forminmountains:msg=m[0]+m[1]+

"的海拔為"+

str(m[2])

+

"米。"print(msg)泰山玉皇頂?shù)暮0螢?/p>

1532.7米。華山南峰的海拔為

2154.9米。黃山蓮花峰的海拔為

1864.8米。峨眉山萬佛頂?shù)暮0螢?/p>

3099.0米。武當(dāng)山天柱峰的海拔為

1612.1米。對于嵌套的列表,可以使用單層循環(huán)遍歷,也可以使用雙重循環(huán)遍歷,下面代碼5.5

演示了使

用雙重循環(huán)遍歷

mountains列表。代碼

5.5

使用雙重循環(huán)遍歷嵌套列表。5.1.2遍歷列表tai_shan=

["泰山","玉皇頂",1532.7]hua_shan=

["華山","南峰",2154.9]huang_shan=

["黃山","蓮花峰",1864.8]e_mei_shan=

["峨眉山","萬佛頂",3099.0]wu_dang_shan=

["武當(dāng)山","天柱峰",1612.1]mountains=

[tai_shan,hua_shan,huang_shan,e_mei_shan,wu_dang_shan]forminmountains:for

item

inm:print(item,end="")print("米。")使用

for語句遍歷列表很方便,但不排除有時需要使用

while語句來遍歷列表。當(dāng)使用

while語

句遍歷列表時,需要知道列表的長度,因此先使用

Python

內(nèi)置的

len()函數(shù)來測量列表的長度,如

代碼

5.6所示。代碼

5.6

使用

while語句遍歷列表函數(shù)

len()可用來測量一個序列的長度,如字符串、列表、元組、字典等。另外需要注意的是,

代碼中while循環(huán)的條件不可以寫成“<=”,因為列表最后一項的索引序號比列表的長度小

1。5.1.2遍歷列表tai_shan=

["泰山","玉皇頂",1532.7]hua_shan=

["華山","南峰",2154.9]huang_shan=

["黃山","蓮花峰",1864.8]e_mei_shan=

["峨眉山","萬佛頂",3099.0]wu_dang_shan=

["武當(dāng)山","天柱峰",1612.1]mountains=

[tai_shan,hua_shan,huang_shan,e_mei_shan,wu_dang_shan]length=len(mountains)i

=

0whilei<

length:#不可以寫成<=m=mountains[i]msg=m[0]+m[1]+

"海拔"+

str(m[2])

+

"米。"print(msg)i

+=

1第

4章介紹的運算符“+”和“*”可以用于字符串,同為序列的列表,也可以使用這兩個運算

符,且含義和字符串有異曲同工之妙。下面看代碼

5.7

的演示。代碼

5.7

加法與乘法運算符用于列表加法運算符可以將兩個列表連接成一個更長的列表,注意是形成一個新的更長的列表,參與加

法運算的原始兩個列表沒有發(fā)生變化。而列表與整數(shù)之間的乘法運算則是將這個列表重復(fù)整數(shù)遍,得到一個新的更長的列表。5.1.3列表的運算符south_mountains=

["武夷山","倉山","黃山","峨眉山","武當(dāng)山"]

north_mountains=

["泰山","華山","恒山","長白山","天山"]mountains=south_mountains+north_mountainsrivers=

["黃河","長江"]

*2

print(len(mountains))print(len(rivers))同樣與字符串類似的是,判斷一個元素是否在列表中時,可以使用成員運算符

in或

notin,如

代碼

5.8所示。代碼

5.8

判斷元素是否在列表中5.1.3列表的運算符buddhism_mountains=

["五臺山","峨眉山","普陀山","九華山"]mountain=input("輸入一座名山:")ifmountainnotinbuddhism_mountains:print(f"{mountain}不屬于佛教四大名山。")else:print(f"{mountain}是佛教四大名山之一。")輸入一座名山:天山天山不屬于佛教四大名山。代碼

5.8

的運行結(jié)果如下。PART25.2列表元素的操作前面介紹過可以使用內(nèi)置函數(shù)

len()測量列表的長度,其實還可以使用內(nèi)置函數(shù)

min()和

max()求得列表中多個元素的最小值和最大值,如代碼

5.9所示。

代碼

5.9

求取列表元素的最值代碼中的列表保存了幾座名山的海拔高度,因此可以使用

min()和

max()方便地得到列表中的最

小海拔和最大海拔。5.2.1元素最值height=

[1532.7,2154.9,1864.8,3099.0,1612.1]print(min(height))

#1532.7print(max(height))

#3099.0有多種方法可以向列表中添加新的元素,這里介紹以下

3種。1.a(chǎn)ppend()方法列表的append()方法可以向列表尾部追加一個元素。中國的名山大川還有很多,如果希望將更

多的名山追加到列表中,一次一座,可如代碼

5.10

所示。代碼

5.10

向列表中添加元素——append()方法這段代碼首先通過一個空的方括號定義了一個不含任何元素的空列表,之后通過循環(huán)從鍵盤上

接收一個個的山名。這里的哨兵值為英文字母

Q,輸入

Q循環(huán)結(jié)束(大小寫均可)。代碼后半段統(tǒng)計列表的長度,并遍歷輸出列表中的各山名。5.2.2增加元素mountains=

[]

#空列表m=input("你知道祖國的哪些名山(退出:Q)?")whilem.upper()

!="Q":mountains.append(m)m=input("你知道祖國的哪些名山(退出:Q)?")count=len(mountains)print(f"你說出了{(lán)count}座祖國的名山,它們是")forminmountains:print(m,end=",")你知道祖國的哪些名山(退出:Q)?泰山你知道祖國的哪些名山(退出:Q)?黃山你知道祖國的哪些名山(退出:Q)?長白山你知道祖國的哪些名山(退出:Q)?q你說出了

3座祖國的名山,它們是泰山,黃山,長白山,代碼

5.10

的運行結(jié)果如下。2.insert()方法append()方法只能將元素添加到列表的尾部,如果需要將新的元素添加到列表中間的某個位置,

則可以使用

insert()方法,如代碼

5.11所示。代碼

5.11

向列表中添加元素——insert()方法除了需要添加的新元素,insert()方法還需要指明新元素插入的位置,因此insert()方法需要兩個

參數(shù),第一個參數(shù)為插入的位置,第二個元素為新的元素。添加新元素后,該位置及后面的原有元

素均會后移一個位置,列表長度增加

1。5.2.2增加元素mountains=

["泰山","華山","黃山","峨眉山","武當(dāng)山"]mountains.insert(2,"嵩山")print(mountains)

#['泰山','華山','嵩山','黃山','峨眉山','武當(dāng)山']3.extend()方法如果希望一次性向列表添加多個元素,則可以使用

extend()方法。它可將一個列表的所有元素一次性添加到另外一個列表中,如代碼

5.12所示。代碼

5.12

向列表中添加元素——extend()方法代碼中的

mountains列表一開始是空列表,在連續(xù)調(diào)用兩次

extend()方法將另外兩個列表中的元

素復(fù)制到本身后,長度變?yōu)?/p>

10。extend()方法沒有返回值,也不會改變提供元素的兩個列表。5.2.2增加元素south_mountains=

["武夷山","倉山","黃山","峨眉山","武當(dāng)山"]north_mountains=

["泰山","華山","恒山","長白山","天山"]mountains=

[]mountains.extend(south_mountains)mountains.extend(north_mountains)print(len(mountains))

#10列表中的元素是可以修改的,使用索引序號指明要修改的元素即可,注意索引不要越界。代碼

5.13將列表中的前兩個元素修改為省份加名山,但在修改九華山時報錯,原因是弄錯了元素的索引,

導(dǎo)致索引越界。代碼

5.13

修改列表的元素在修改列表元素時,也可以使用切片式寫法一次修改多個元素,被換的元素和用來替換的元素個數(shù)可以不同。如代碼

5.14

將原始列表中的四大佛教名山替換為五岳,列表的長度也因此增加

1。代碼

5.14

修改列表的片段5.2.3修改元素buddhism_mountains=

["五臺山","峨眉山","普陀山","九華山"]buddhism_mountains[0]="山西五臺山"buddhism_mountains[1]="四川峨眉山"#buddhism_mountains[4]="安徽九華山"

#報錯,索引越界print(buddhism_mountains)mountains=

["太行山","五臺山","峨眉山","普陀山","九華山","祁連山"]print(len(mountains))#6mountains[1:5]=

["泰山","華山","衡山","恒山","嵩山"]print(len(mountains))#7print(mountains)#列表變?yōu)?/p>

['太行山','泰山','華山','衡山','恒山','嵩山','祁連山']刪除列表中已有元素的方法有多種,這些方法有的需要指明要刪除的元素本身,有的需要指明

要刪除元素的索引序號,有的會將刪除的元素返回,還有的沒有返回值。1.del()函數(shù)del()函數(shù)根據(jù)指定的索引序號刪除相應(yīng)的元素,沒有返回值。注意,del()函數(shù)不是列表擁有的

方法,因此在書寫形式上與后面的pop()等方法不同,這一點從代碼5.15可明顯地看出來。代碼

5.15

使用

del()函數(shù)刪除列表元素代碼開始的列表中,佛教名山中混有武當(dāng)山、龍虎山、青城山、終南山

4個道教名山。代碼首

先刪除索引序號為

2

的武當(dāng)山,原列表中從峨眉山開始,其后的元素序號均發(fā)生變化。龍虎山、青

城山、終南山等道教名山的索引序號不再是

4、5、6,而應(yīng)是

3、4、5,因此在使用

del()函數(shù)刪除這

幾座道教名山時,切片起止位置應(yīng)寫為[3:6],結(jié)尾位置索引6

不包含在內(nèi)。列表最后的效果如代碼

中的注釋所示,只剩佛教名山了。5.2.4刪除元素mountains=

["梵凈山","五臺山","武當(dāng)山","峨眉山","龍虎山","青城山","終南山","普陀山","九華山","雞足山"]del(mountains[2])#刪除"武當(dāng)山",武當(dāng)山之后的元素索引有變化del(mountains[3:6])

#刪除"龍虎山","青城山","終南山"print(mountains)#列表變?yōu)?/p>

['梵凈山','五臺山','峨眉山','普陀山','九華山','雞足山']2.pop()方法與

del()函數(shù)不同,pop()是列表的方法,因此在書寫時要按照面向?qū)ο蟮摹包c”格式來書寫,即

列表名.方法名。與del()函數(shù)相同的是,pop()方法也根據(jù)元素的序號位置刪除相應(yīng)的元素,但

pop()

方法會返回被刪除的元素,如代碼

5.16所示。代碼

5.16使用

pop()方法刪除列表元素5.2.4刪除元素mountains=

["梵凈山","五臺山","武當(dāng)山","峨眉山","龍虎山","青城山","終南山","普陀山","九華山","雞足山"]taoism_mountains=

[]#保存被刪除的道教名山ix=

[2,3,3,3]for

i

in

ix:m=mountains.pop(i)taoism_mountains.append(m)print(mountains)#['梵凈山','五臺山','峨眉山','普陀山','九華山','雞足山']print(taoism_mountains)#['武當(dāng)山','龍虎山','青城山','終南山']這段代碼同樣要將名山列表中的道教名山刪除,只留下佛教名山,但因為使用了pop()方法,所

以每次

pop()方法會將刪除的山名返回并保存到變量

m

中。代碼預(yù)備了一個空的道教名山列表,被

刪除的山名都被追加到這個列表中。3.remove()方法刪除列表中元素的第三種方法是使用列表的remove()方法,這個方法不是根據(jù)索引序號來刪除

元素,而是需要指明要刪除的元素本身。另外,remove()方法不返回被刪除的元素。代碼

5.17

清楚

地演示了這一點。代碼

5.17使用

remove()方法刪除列表元素以上介紹的刪除列表元素的

3種方法各具特點,適用于不同的情景。5.2.4刪除元素mountains=

["梵凈山","五臺山","武當(dāng)山","峨眉山","龍虎山","青城山","終南山","普陀山","九華山","雞足山"]taoism_mountains=

['武當(dāng)山','龍虎山','青城山','終南山']formintaoism_mountains:mountains.remove(m)print(mountains)#['梵凈山','五臺山','峨眉山','普陀山','九華山','雞足山']表

5.1對

del()函數(shù)、pop()

方法、remove()方法進(jìn)行了對比。5.2.4刪除元素刪除列表元素的方法根據(jù)索引序號根據(jù)元素本身返回被刪除元素del()函數(shù)√pop()方法√√remove()方法√表5.1

3種刪除列表元素方法的對比4.clear()方法如果需要將列表中所有的元素都刪除,即將列表清空,則可以使用列表的

clear()方法。代碼

5.18

需要互動者輸入多條河流的流經(jīng)省份。程序使用雙重循環(huán),外層循環(huán)遍歷每一條河流,內(nèi)層循環(huán)不

斷詢問當(dāng)前河流的流經(jīng)省份,直到輸入的是哨兵值“Q”或“q”。得到的省份被追加到provinces

列表中,代碼最后在輸出當(dāng)前河流的流經(jīng)省份后,外層循環(huán)進(jìn)入下一條河流,因此循環(huán)體一開始要

將provinces列表清空,為記錄新的河流流經(jīng)省份做好準(zhǔn)備。代碼

5.18使用

clear()方法清空列表元素5.2.4刪除元素rivers=

["長江","黃河"]provinces=

[]print("說出以下河流主干流經(jīng)的省、自治區(qū)、直轄市,一次一個,輸入

Q結(jié)束。")for

r

in

rivers:provinces.clear()p=

input(f"{r}:")whilep.upper()

!=

"Q":provinces.append(p)p=

input(f"{r}:")print(f"{r}主干流經(jīng):{provinces}")代碼

5.18

的運行結(jié)果如下。5.2.4刪除元素說出以下河流主干流經(jīng)的省、自治區(qū)、直轄市,一次一個,輸入

Q結(jié)束。長江:青海長江:西藏長江:四川長江:云南長江:重慶長江:湖北長江:湖南長江:江西長江:安徽長江:江蘇長江:上海長江:Q長江主干流經(jīng):['青海','西藏','四川','云南','重慶','湖北','湖南','江西','安徽','江蘇','上海']黃河:青海黃河:四川黃河:甘肅黃河:寧夏黃河:內(nèi)蒙古黃河:陜西黃河:山西黃河:河南黃河:山東黃河:Q黃河主干流經(jīng):['青海','四川','甘肅','寧夏','內(nèi)蒙古','陜西','山西','河南','山東']前面介紹了可以對列表元素求最值,其實如果將列表中的元素排好序,最值就很容易獲得了。

對列表中的元素排序時,可以使用列表的

sort()方法,如代碼

5.19所示。代碼

5.19使用

sort()方法對列表元素排序sort()方法會直接在原列表上進(jìn)行排序操作。如果希望進(jìn)行降序排序,則可以啟用sort()方法的

reverse參數(shù),該參數(shù)為

True時意味著降序排序。5.2.5元素排序height=

[1532.7,2154.9,1864.8,3099.0,1612.1]height.sort()#升序print("升序:",height)height.sort(reverse=True)#降序print("降序:",height)升序:

[1532.7,1612.1,1864.8,2154.9,3099.0]降序:

[3099.0,2154.9,1864.8,1612.1,1532.7]代碼

5.19

的運行結(jié)果如下。另外,列表還有一個reverse()方法,其含義是將列表中元素的當(dāng)前順序顛倒過來,因此它既不

是進(jìn)行升序排序,也不是進(jìn)行降序排序,而是原始順序的逆序排列。代碼

5.20

列表的

reverse()方法特別要將列表的

reverse()方法和

sort()方法的

reverse參數(shù)區(qū)分開,二者沒有必然的聯(lián)系。5.2.5元素排序height=

[1532.7,2154.9,1864.8,3099.0,1612.1]print("原序:",height)height.reverse()print("逆序:",height)原序:

[1532.7,2154.9,1864.8,3099.0,1612.1]逆序:

[1612.1,3099.0,1864.8,2154.9,1532.7]代碼

5.20

的運行結(jié)果如下。PART35.3元組元組是

Python

中另一個常用的組合數(shù)據(jù)類型,其很多用法與列表類似。元組的創(chuàng)建使用圓括號

tuple()函數(shù),如代碼

5.21所示。代碼

5.21

認(rèn)識元組代碼使用圓括號定義了一個元組來保存一些山名。從代碼可見元組的切片語法規(guī)則和列表完

全相同。但代碼的最后一行卻會報錯,這是因為元組中的元素是無法修改的。這一點是元組區(qū)

別于列表的一個顯著特征,可以簡單地認(rèn)為元組是“只讀的列表”,因此元組的訪問速度要優(yōu)

于列表5.3.1認(rèn)識元組mountains=

("武當(dāng)山","龍虎山","青城山","終南山","五臺山","峨眉山","普陀山","九華山")print("道教名山:",mountains[:4])print("佛教名山:",mountains[4:])mountains[0]=

"三清山"

#報錯#TypeError:

'tuple'objectdoesnotsupportitem

assignment。元組既然也保存有一系列的數(shù)據(jù),當(dāng)然可以使用

for語句進(jìn)行遍歷,過程與列表一般無二,如代

5.22所示。代碼

5.22

遍歷元組river_provinces列表中有兩個元素,每個元素又是一個列表,分別保存長江與黃河的流經(jīng)省份。在收集流經(jīng)省份時使用了臨時列表

temp,收集完長江流經(jīng)省份后,該列表被追加到

river_provinces列表中,成為

river_provinces列表的第

1個元素。

而后外層循環(huán)開始第

2輪循環(huán),此時會有一個新的

temp空列表誕生,收集的黃河流經(jīng)省份保存在這個新的

temp列表中,最后被追加到river_provinces列表中成為它的第

2個元素。5.3.2遍歷元組rivers=

("長江","黃河")#元組river_provinces=

[]print("說出以下河流主干流經(jīng)的省、自治區(qū)、直轄市,一次一個,輸入

Q結(jié)束。")forr

in

rivers:

#遍歷元組temp

=

[]p=

input(f"{r}:")whilep.upper()

!=

"Q":temp.append(p)p=

input(f"{r}:")river_provinces.append(temp)foriinrange(len(rivers)):

#遍歷元組的另一種形式print(f"{rivers[i]}流經(jīng):{river_provinces[i]}")PART45.4字典字典也是一種組合數(shù)據(jù)類型,但其與列表、元組最大的不同在于,字典中的每一個元素都由兩

部分構(gòu)成,中間用冒號分隔,稱為一個鍵值對。為了更好地理解鍵值對的概念,可以設(shè)想這樣一個

問題:如何同時保存一系列名山的山名和海拔高度。如果使用列表或元組,大概類似代碼

5.23

中的方式1

或方式

2。這兩種方式都有使用上的不便,如用戶想要輸入山名來查詢相應(yīng)的海拔高度,方式

1和方式

2實現(xiàn)起來都不方便。此時字典的效用就凸顯出來了。代碼的第

3種方式使用了字典來

保存山名和對應(yīng)的高度。使用花括號“{}”定義字典,字典中的每一個元素都由山名和高度兩部分

構(gòu)成,中間用冒號分隔,冒號左側(cè)部分被稱為鍵(Key),冒號右側(cè)部分被稱為值(Value)。一個元素即為一個鍵值對,代碼中的字典共有

3個元素,長度為

3。5.4.1認(rèn)識字典代碼

5.23

認(rèn)識字典代碼中的方式

3無論用戶輸入的是

3

座山中的哪一個,最后的

print()都可以根據(jù)山名直接得到

對應(yīng)的高度。這是使用字典的優(yōu)點,字典可以根據(jù)鍵來訪問相應(yīng)的值。因此字典特別適合保存有映

射關(guān)系的數(shù)據(jù),如這里的山名與相應(yīng)的高度就具有映射關(guān)系。通過對比代碼

5.23方式

2

中保存高度的列表和方式

3

中的字典可以看出,方式

2

的列表

height

保存了

3個高度值,但沒有對應(yīng)的山名信息(山名在另外一個列表中),訪問列表

height

中的高

度值時需要使用索引序號。而從方式

3

的字典則能明確看出高度值與山名的對應(yīng)關(guān)系,訪問高度

值時使用對應(yīng)的鍵也就是山名即可。因此字典的鍵可以看作是對列表的索引序號進(jìn)行了擴(kuò)展,讓

索引序號有了明確的稱謂。字典既然通過鍵來訪問元素值,鍵即為元素的標(biāo)識,一個字典中不允

許有重復(fù)的鍵,但值可以重復(fù)。例如,上面的字典中,山名不可重復(fù),但如果兩座山的高度相同

是沒問題的。5.4.1認(rèn)識字典#保存山名、高度,方式

1mountains_height=

["泰山",1532.7,"華山",2154.9,"黃山",1864.8]#保存山名、高度,方式

2mountains=

["泰山","華山","黃山"]height=

[1532.7,2154.9,1864.8]#保存山名、高度,方式

3mountains_height_dic=

{"泰山":1532.7,"華山":2154.9,"黃山":1864.8}m_name=input("泰山、華山、黃山選一個:")print(mountains_height_dic[m_name])與列表類似,字典也有很多常用的操作,掌握這些操作是使用字典必備的技能。1.通過鍵訪問值字典是通過鍵來訪問相應(yīng)的值的,但如果提供了一個字典中不存在的鍵,則代碼會報

KeyError

的錯誤。例如,在上面的代碼

5.23

中,如果用戶輸入的山名在字典中不存在,那么最后的

print()就

會出問題。因此為了避免程序出錯,可以使用

in操作符來判斷一下,確保該鍵存在,如代碼

5.24

所示。代碼

5.24

通過鍵訪問值這樣無論用戶查詢的山名是否在字典中,程序都可以給出合理的回應(yīng),就不會崩潰了。5.4.2字典的常見操作mountains_height=

{"泰山":1532.7,"華山":2154.9,"黃山":1864.8}m_name=input("想知道哪座山的海拔?")ifm_nameinmountains_height:print(mountains_height[m_name])else:print(f"對不起,程序未收錄{m_name}的海拔高度")只是如果每次讀取字典中某個鍵的值時都需要用

if

語句進(jìn)行判斷,這樣有些煩瑣,字典提供了

get()方法來

解決這個問題。通過

get()方法讀取一個鍵的值,如果要訪問的鍵在字典中存在,則一切正常;如果

該鍵不存在,則程序不會報錯崩潰,而是返回事先指定的值。下面看代碼

5.25

的示范。代碼

5.25

字典的

get()方法這段代碼最關(guān)鍵的一句是使用get()方法來訪問m_name這座山的高度值,如果m_name在

mountains_height字典中存在,則正常返回m_name對應(yīng)的值。如果輸入的

m_name不在字典當(dāng)中,

get()方法會返回第二個參數(shù)指定的預(yù)設(shè)值,即

msg這個消息。這樣程序無論在哪種情形下都不會

崩潰,同時代碼又比較簡潔。5.4.2字典的常見操作mountains_height=

{"泰山":1532.7,"華山":2154.9,"黃山":1864.8}m_name=input("想知道哪座山的海拔?")msg="對不起,程序未收錄{}的海拔高度".format(m_name)result=mountains_height.get(m_name,msg)print(result)2.字典的遍歷與列表、元組類似,字典中的元素同樣可以使用

for語句進(jìn)行遍歷。但因為字典的元素是鍵值對,

所以遍歷的花樣多一些。第一種:遍歷字典中的所有鍵,如代碼

5.26所示。代碼

5.26

遍歷字典中的所有鍵這段代碼構(gòu)造了一個有關(guān)橋梁的字典,其中橋梁的類型作為字典的鍵,具體的橋梁作為字典的值。代碼通過字典的keys()方法得到所有的鍵,然后使用

for語句

遍歷所有鍵構(gòu)成的序列。5.4.2字典的常見操作bridges=

{"梁橋":"湖北武漢長江大橋","拱橋":"河北趙州橋","斜拉橋":"上海南浦大橋","懸索橋":"江蘇五峰山長江大橋"}forkey

inbridges.keys():print(key,bridges[key])梁橋湖北武漢長江大橋拱橋河北趙州橋斜拉橋上海南浦大橋懸索橋江蘇五峰山長江大橋代碼

5.26

的運行結(jié)果如下。遍歷所有鍵是最常用的一種遍歷字典的方法。因為鍵是字典中元素的標(biāo)識,所以上面的代碼

5.26

可以省去

keys(),直接在

for語句中寫字典名即可,如代碼

5.27所示。代碼

5.27遍歷字典中的所有鍵的簡略寫法為了使代碼的運行結(jié)果更美觀,使用字符串格式化對輸出文字進(jìn)行對齊。其中,鍵的部分寬度

3個字符,不足的填補全角空格,右對齊。代碼中的

chr(12288)即為全角空格。代碼

5.27

的運行

結(jié)果如下,對比上一段代碼整齊了很多。5.4.2字典的常見操作bridges=

{"梁橋":"湖北武漢長江大橋","拱橋":"河北趙州橋","斜拉橋":"上海南浦大橋","懸索橋":"江蘇五峰山長江大橋"}forkey

inbridges:print(f"{key:{chr(12288)}>3}:{bridges[key]}")梁橋:湖北武漢長江大橋拱橋:河北趙州橋斜拉橋:上海南浦大橋懸索橋:江蘇五峰山長江大橋第二種:遍歷字典中所有的值,如代碼

5.28所示。

代碼

5.28

遍歷字典中所有的值代碼使用字典的

values()方法獲取所有的值,然后進(jìn)行遍歷,輸出結(jié)果只有字典的值,也就是具

體的橋梁代表。5.4.2字典的常見操作bridges=

{"梁橋":"湖北武漢長江大橋","拱橋":"河北趙州橋","斜拉橋":"上海南浦大橋","懸索橋":"江蘇五峰山長江大橋"}forbridgeinbridges.values():print(bridge)湖北武漢長江大橋河北趙州橋上海南浦大橋江蘇五峰山長江大橋第三種:遍歷所有的鍵值對,如代碼

5.29所示。

代碼

5.29

遍歷字典的所有鍵值對這段代碼使用字典的

items()方法得到所有的鍵值對,每個鍵值對就是一個元素,包含兩部分。

從下面的運行結(jié)果可看出,鍵值對以元組的形式輸出。上述代碼中的每個元素都以一個元組的形式返回,如果不喜歡這種形式,則可以在

for語句循環(huán)

變量的位置書寫兩個變量名,一個為每個元素的鍵預(yù)備,另一個為每個元素的值預(yù)備。如代碼

5.30

所示,這樣就可以有不一樣的運行結(jié)果。需要說明的是,for語句中的兩個循環(huán)變量不一定命名為key

value,只要有描述意義就可以。5.4.2字典的常見操作bridges=

{"梁橋":"湖北武漢長江大橋","拱橋":"河北趙州橋","斜拉橋":"上海南浦大橋","懸索橋":"江蘇五峰山長江大橋"}foritem

inbridges.items():print(item)('梁橋','湖北武漢長江大橋')('拱橋','河北趙州橋')('斜拉橋','上海南浦大橋')('懸索橋','江蘇五峰山長江大橋')代碼

5.30遍歷字典的所有鍵值對(另一種寫法)代碼

5.30

的運行結(jié)果如下,已經(jīng)沒有元組的圓括號了。如果希望對齊或其他更靈活的展現(xiàn)形式,

則可以使用字符串格式化知識來實現(xiàn)。5.4.2字典的常見操作bridges=

{"梁橋":"湖北武漢長江大橋","拱橋":"河北趙州橋","斜拉橋":"上海南浦大橋","懸索橋":"江蘇五峰山長江大橋"}forkey,valueinbridges.items():print(key,value)梁橋湖北武漢長江大橋拱橋河北趙州橋斜拉橋上海南浦大橋懸索橋江蘇五峰山長江大橋3.修改已有元素與列表類似,字典中的數(shù)據(jù)是可以修改的。列表中的元素可以通過元素的索引序號來直接修改。

同樣地,修改字典中的元素值時可以通過鍵來實現(xiàn)。別忘了,字典的鍵即對列表的索引序號的擴(kuò)展。

下面的代碼

5.31將字典中的“梁橋”對應(yīng)的具體橋梁案例改成了江蘇丹昆特大橋,它起自丹陽,途

徑常州、無錫、蘇州,終于昆山,全長超過

164千米。代碼

5.31

修改字典已有的元素值5.4.2字典的常見操作bridges=

{"梁橋":"湖北武漢長江大橋","拱橋":"河北趙州橋","斜拉橋":"上海南浦大橋","懸索橋":"江蘇五峰山長江大橋"}bridges["梁橋"]="江蘇丹昆特大橋"print(bridges["梁橋"])

#輸出江蘇丹昆特大橋4.添加新元素向字典中添加元素的方法非常簡單,只需通過賦值語句直接將新元素的值賦給新元素的鍵即可。

例如,有一種剛構(gòu)橋,雖然外觀和梁橋很像,但結(jié)構(gòu)又有不同,一些橋梁專家將其單獨列為一類。

代碼

5.32想要在橋梁字典中添加剛構(gòu)橋類型,一開始字典中只有

4個元素,通過賦值語句添加了一個“剛構(gòu)橋”的橋梁案例,字典的長度變?yōu)?/p>

5。代碼

5.32

向字典添加新元素5.4.2字典的常見操作bridges=

{"梁橋":"湖北武漢長江大橋","拱橋":"河北趙州橋","斜拉橋":"上海南浦大橋","懸索橋":"江蘇五峰山長江大橋"}print(len(bridges))

#字典長度為4bridges["剛構(gòu)橋"]="貴州赫章特大橋"print(len(bridges))

#字典長度為55.刪除已有元素刪除字典中已有元素的方法有多種,和列表很類似,對比著記憶效果會更好。首先,使用字典的

pop()方法來刪除已有元素。列表的

pop()方法根據(jù)索引序號來刪除元素,字

典的

pop()方法根據(jù)鍵來刪除元素。其次,也可以使用

del()函數(shù)來刪除已有元素。代碼

5.33

開始時

的橋梁字典長度為

5,使用

pop()方法刪除剛構(gòu)橋后,字典的長度變?yōu)?/p>

4,再使用

del()函數(shù)刪除拱橋

后,字典的長度為

3。另外,與列表一致的是,pop()方法有返回值,而

del()函數(shù)沒有返回值。代碼

5.33

刪除字典中的已有元素5.4.2字典的常見操作bridges=

{"梁橋":"湖北武漢長江大橋","剛構(gòu)橋":"貴州赫章特大橋","拱橋":"河北趙州橋","斜拉橋":"上海南浦大橋","懸索橋":"江蘇五峰山長江大橋"}poped_bridge=bridges.pop("剛構(gòu)橋")print(poped_bridge)#貴州赫章特大橋print(len(bridges))#長度為

4del(bridges["拱橋"])print(len(bridges))#長度為3bridges=

{"梁橋":"湖北武漢長江大橋","剛構(gòu)橋":"貴州赫章特大橋","拱橋":"河北趙州橋","斜拉橋":"上海南浦大橋","懸索橋":"江蘇五峰山長江大橋"}bridges.clear()print(len(bridges))

#長度為0代碼

5.34

清空字典中的元素調(diào)用了字典的

clear()方法之后,bridges

中現(xiàn)在有

0

個元素。PART55.5Python生態(tài)系統(tǒng)之jieba庫因為

jieba

庫是第三方庫,所以安裝Python

環(huán)境時是沒有這個庫的,需要額外單獨安裝。如果

使用的是

PyCharm

編程工具,那么啟動

PyCharm

后在其界面下方圖

5.2

所示的位置選擇【Python

Packages】面板,然后在圖中左上角的搜索框中輸入jieba,就可以在下方的列表中看到j(luò)ieba庫了,

選擇jieba庫后單擊圖中右上角的【Installpackage】按鈕即可開始安裝,顯示成功信息之后就可以如

標(biāo)準(zhǔn)庫一樣導(dǎo)入使用了。如果使用的不是

PyCharm,則可以在

Windows“開始”菜單的“運行”對話框中輸入

cmd,然

后按

Enter鍵,在打開的命令行窗口中輸入pipinstall

jieba,同樣可以安裝jieba庫。5.5.1jieba庫的安裝馬可·波羅在他聞名于世的游記中描述了中國的很多城市,這些城市即使是對來自西方美麗城

市威尼斯的馬可

·波羅而言也好比天堂般的存在,游記讓歐洲人對東方世界產(chǎn)生了強烈向往,甚至

對新航路的開辟都產(chǎn)生了重大影響。游記的第

2

卷著重描述了元朝時期的中國,下面就來對這部游

記的第

2卷進(jìn)行詞頻分析,看看馬可·波羅都寫了什么。要進(jìn)行詞頻分析,首先要將游記的文本進(jìn)

行分詞操作。本案例中《馬可·波羅游記》的文本以一個

TXT文本文件提供,因此首先要將文本中的內(nèi)容讀

入內(nèi)存,這可以使用

Python

的內(nèi)置函數(shù)

open()來完成。有關(guān)

open()函數(shù)的內(nèi)容將在第

7章中進(jìn)行介

紹。讀入文本文件后會得到一個長長的字符串,接下來的分詞就是基于這個字符串完成的。代碼

5.35

演示了整個流程。代碼

5.35使用jieba庫進(jìn)行中文分詞

5.5.2分詞的基本操作import

jiebatxt_file=open("file\\馬可

·波羅游記第

2卷.txt",encoding="utf-8")marco_txt=txt_file.read()print(marco_txt[:20])#查看原文的前

20個字words=jieba.lcut(marco_txt)

#分詞print(words[:10])#查看分詞結(jié)果的前

10個詞代碼

5.35

的運行結(jié)果如下,第一行為原文的前

20個字,第二行顯示分詞結(jié)果的前

10個詞。方

括號意味著分詞得到的是一個列表。簡單分析上面的代碼。使用

open()函數(shù)讀入文件時要提供文件名,這里假設(shè)游記對應(yīng)的

TXT文

件位于

file文件夾下,該文件夾與代碼

5.35

的代碼文件在同一目錄位置。open()函數(shù)會返回一個文件

對象,調(diào)用該對象的

read()方法可將文本文件的內(nèi)容讀出,保存在變量

marco_txt

中。為了直觀看到

效果,程序在這里輸出游記的前

20個字。接下來是核心的分詞工作。分詞操作使用jieba庫中的

lcut()

函數(shù)來完成。函數(shù)名中的

l表示

list,分詞完成后返回的是一個列表,其中保存著分好的一個個詞匯。

代碼最后輸出前

10個詞,從結(jié)果可以看出,jieba庫分詞的結(jié)果還是很好的。5.5.2分詞的基本操作第二卷忽必烈大汗和他的宮廷西南行程中各省['第二卷','忽必烈','大汗','和','他','的','宮廷','西南','行程','中']有了分詞結(jié)果,接下來就可以做很多統(tǒng)計工作了,如詞頻統(tǒng)計,查看游記第

2

卷中哪些詞的出現(xiàn)頻率比較高。如何完成這個工作呢?還是按照

IPO建構(gòu)法來進(jìn)行分析。輸入:jieba庫分詞后的列表。輸出:某某詞,多少次;某某詞,多少次;這明顯是映射效果,可以使用字典。處理:如何將輸入的列表變?yōu)橐粋€字典輸出呢?列表中的詞可以重復(fù),而字典應(yīng)該是一個詞作

為一個鍵,該詞在列表中重復(fù)的遍數(shù)作為對應(yīng)的值。所以應(yīng)該遍歷列表,碰到一個詞就去字典中給

這個詞對應(yīng)的次數(shù)加

1。代碼

5.36實現(xiàn)了這個過程,這段代碼和前面的代碼

5.35是接著的,其中的

words變量就是分詞

得到的列表。5.5.3詞頻統(tǒng)計代碼

5.36

根據(jù)分詞結(jié)果進(jìn)行詞頻統(tǒng)計按照

IPO分析,代碼首先對

words列表進(jìn)行遍歷,略過其中的單字詞,只統(tǒng)計兩個字以上的詞匯。代碼使用了字典的

get()方法巧妙地解決了第一次遇見某個詞,但該詞在字典中還未出現(xiàn)的情形。得到詞頻字典后為了更好地輸出,代碼將字典的所有鍵值對按照值的大小降序排列,最后輸出前

10

個頻度最高的詞,結(jié)果如下。5.5.3詞頻統(tǒng)計word_freq=

{}#保存詞頻的字典forword

inwords:iflen(word)==

1:#忽略一個字的詞continueelse:word_freq[word]=word_freq.get(word,0)+1#按詞頻降序排好word_freq_lst=list(word_freq.items())word_freq_lst.sort(key=lambdax:x[1],reverse=True)#輸出前

10個高頻詞fori

in

range(10):print(f"{word_freq_lst[i][0]}

:

{word_freq_lst[i][1]}")他們:344一個:245大汗:218這里:152這個:128許多:121這些:117居民:116這種:114自己:100從結(jié)果可以看出,有很多價值不大的詞出現(xiàn)在前面,如排在第一位的“他們”、排在第二位的

“一個”等??梢詫⑦@些價值不大的詞從詞頻字典中去掉,這其實就是停用詞(StopWords)處理。

代碼

5.37在上述代碼的基礎(chǔ)上添加了去掉停用詞的代碼,見代碼中的粗體部分。代碼

5.37

去掉停用詞后的詞頻統(tǒng)計5.5.3詞頻統(tǒng)計word_freq=

{}#保存詞頻的字典fo

溫馨提示

  • 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

提交評論