版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第4章非序列組合信息學(xué)院2024引言4.1案例:四國(guó)宏觀經(jīng)濟(jì)數(shù)據(jù)對(duì)比4.2字典4.3集合4.4JSON文件4.5編程實(shí)踐:Pygal4.6本章小結(jié)4.7習(xí)題本章將學(xué)習(xí)最后兩種數(shù)據(jù)類型:字典和集合。在此基礎(chǔ)上,還將學(xué)習(xí)常用的數(shù)據(jù)文件之一:JSON文件。在章首案例的指引下,本章還將學(xué)習(xí)使用一些標(biāo)準(zhǔn)庫(kù)和第三方庫(kù)。在編寫(xiě)完成案例程序之后,就學(xué)會(huì)了讀取數(shù)據(jù)文件初步做一些數(shù)據(jù)分析和處理工作。4.1案例:四國(guó)宏觀經(jīng)濟(jì)數(shù)據(jù)對(duì)比DataHub(https://datahub.io)是一個(gè)免費(fèi)的公共數(shù)據(jù)平臺(tái),提供了國(guó)際組織、不同國(guó)家、地方政府、研究機(jī)構(gòu)發(fā)布的高質(zhì)量數(shù)據(jù)集,涉及金融、醫(yī)療、社科、教育等眾多領(lǐng)域。本章案例搜集并下載的是世界各國(guó)1960年以來(lái)的人口、GDP和人均GDP的數(shù)據(jù)集,都是JSON(JavaScriptObjectNotation)文件,JSON是一種通用的輕量級(jí)的數(shù)據(jù)交換格式。編寫(xiě)程序?qū)χ袊?guó)、美國(guó)、英國(guó)和印度這四國(guó)60年來(lái)的宏觀經(jīng)濟(jì)數(shù)據(jù)進(jìn)行對(duì)比和展示,需要說(shuō)明的是,該數(shù)據(jù)集中包含了世界所有國(guó)家的數(shù)據(jù),我們選擇了這四國(guó)進(jìn)行對(duì)比。首先讓用戶選擇要對(duì)比的數(shù)據(jù)文件,注意這里的文件類型限定為JSON文件(*.json)。本章案例可以選擇三個(gè):“gdp_pcap.json”是世界各國(guó)的人均GDP數(shù)據(jù),“gdp.json”是世界各國(guó)的GDP數(shù)據(jù),“population.json”是世界各國(guó)的人口數(shù)據(jù)。4.1案例:四國(guó)宏觀經(jīng)濟(jì)數(shù)據(jù)對(duì)比首先選擇“gdp_pcap.json”,程序運(yùn)行后出現(xiàn)如下提示:Pleasecheckfile:gdp_pcap_compared.svg在和程序相同的文件夾下找到該圖形文件,雙擊用瀏覽器打開(kāi),可以看到對(duì)于中國(guó)、美國(guó)、英國(guó)、印度這四國(guó)的人均GDP對(duì)比,左上角顯示了圖例,將鼠標(biāo)停留在某個(gè)點(diǎn)上,可以看到具體數(shù)據(jù)。4.1案例:四國(guó)宏觀經(jīng)濟(jì)數(shù)據(jù)對(duì)比從人均GDP上來(lái)看,美國(guó)和英國(guó)這兩個(gè)發(fā)達(dá)國(guó)家基本接近,美國(guó)的增長(zhǎng)勢(shì)頭強(qiáng)于英國(guó)。再次運(yùn)行程序,選擇“gdp.json”,生成“gdp_compared.svg”圖形文件。同樣,可以生成4國(guó)人口數(shù)據(jù)對(duì)比圖??梢钥闯觯褐袊?guó)的人口增速低于印度,但明顯高于美國(guó)和英國(guó);2006年中國(guó)的GDP超過(guò)英國(guó),與美國(guó)的差距也在逐漸縮小。4.1案例:四國(guó)宏觀經(jīng)濟(jì)數(shù)據(jù)對(duì)比除列表之外,字典(dictionary)是另外一種最經(jīng)常被用來(lái)處理數(shù)據(jù)集合的組合數(shù)據(jù)類型,二者經(jīng)常一起使用。4.2字典列表中的單個(gè)元素是通過(guò)索引號(hào)(下標(biāo))來(lái)獲取的,如果多個(gè)列表之間的信息存在關(guān)聯(lián),一般也是通過(guò)索引號(hào)來(lái)一一對(duì)應(yīng)的。在第3章案例中,分別定義了3個(gè)列表來(lái)存儲(chǔ)不同項(xiàng)數(shù)(item_values)、不同項(xiàng)數(shù)對(duì)應(yīng)的pi值(pi_values)以及不同項(xiàng)數(shù)對(duì)應(yīng)的精確小數(shù)位數(shù)(accu_values),要查找某一項(xiàng)數(shù)對(duì)應(yīng)的pi值和精確小數(shù)位數(shù),需要先通過(guò)第一個(gè)列表來(lái)查找到索引號(hào),然后根據(jù)索引號(hào)去第二個(gè)和第三個(gè)里列表查找。如果要改動(dòng)某一個(gè)列表的順序,其他兩個(gè)列表必須跟著改變。4.2.1字典的表示那能不能把項(xiàng)數(shù)和pi值、精確小數(shù)位數(shù)存放在一起呢,找到某一項(xiàng)數(shù),就能直接找到對(duì)應(yīng)的pi值或精確小數(shù)位數(shù)。這種獲取信息的方式顯然更加靈活,在程序設(shè)計(jì)語(yǔ)言中,我們把這種方式稱為鍵值對(duì)(key-valuepair),這里的鍵就是項(xiàng)數(shù),值就是pi值或精確小數(shù)位數(shù)。這種例子還有很多,比如用戶名—密碼,國(guó)家代碼—國(guó)家名稱,課程編碼—課程信息,學(xué)號(hào)—學(xué)生信息,工號(hào)—教師信息,英語(yǔ)單詞—含義及用法,等等。Python中把由若干個(gè)鍵值對(duì)構(gòu)成的組合類型稱為字典。4.2.1字典的表示字典用花括號(hào)表示,不同的鍵值對(duì)之間用逗號(hào)分隔,鍵與值之間用冒號(hào)分隔。如下語(yǔ)句創(chuàng)建了一個(gè)存儲(chǔ)中國(guó)人口數(shù)據(jù)的字典:CHN={1960:667070000.0,2018:1392730000.0}該字典有兩個(gè)鍵值對(duì),分別存放了中國(guó)1960年和2018年的人口數(shù)據(jù),其中鍵代表年份,值代表人口數(shù)據(jù)??梢钥吹?018年中國(guó)的人口數(shù)據(jù)是1960年的兩倍多。字典中的鍵是唯一的,即不允許同一個(gè)鍵出現(xiàn)兩次,值則沒(méi)有限制。創(chuàng)建字典此外,鍵要求是可哈希的(hashable),可以是任意的不可修改的數(shù)據(jù)類型,包括數(shù)字、字符串和元組,值則沒(méi)有要求,可以是任意對(duì)象。上例中的鍵和值都是數(shù)字類型。字典的轉(zhuǎn)換函數(shù)dict()可以將二元組的列表轉(zhuǎn)換為字典,也可以通過(guò)關(guān)鍵字傳參的方式來(lái)賦值,比如:dict([('x',1),('y',2)])dict(x=1,y=2)返回結(jié)果都是{'x':1,'y':2},注意后一種方式在生成字典的時(shí)候,自動(dòng)把參數(shù)名轉(zhuǎn)換為字符串。創(chuàng)建字典字典中的單個(gè)元素就是一個(gè)鍵值對(duì),和列表不同的是,字典是無(wú)序的,每一個(gè)鍵值對(duì)并沒(méi)有出現(xiàn)的先后次序,因此無(wú)法通過(guò)索引號(hào)(下標(biāo))去訪問(wèn)它們。但可以像查字典一樣,通過(guò)鍵去查找它的值,如下所示:<dict>[key]如果[key]不存在,會(huì)出現(xiàn)鍵錯(cuò)誤(KeyError)。比如:CHN[1990],想查找1990年的中國(guó)人口數(shù)據(jù),CHN中并沒(méi)有1990這個(gè)鍵,就會(huì)報(bào)錯(cuò)。字典中的單個(gè)元素字典和列表一樣,是一種可以修改的數(shù)據(jù)類型,可以添加、修改或刪除某個(gè)元素。想要添加或修改某個(gè)元素,只要給<dict>[key]賦值就可以,如果[key]不存在,則為添加,否則就是修改,會(huì)覆蓋之前的值。如:CHN[1990]=1135185000.0CHN中沒(méi)有1990這個(gè)鍵,因而添加了一個(gè)鍵值對(duì),添加后CHN的值為:{1960:667070000.0,1990:1135185000.0,2018:1392730000.0}記住字典是無(wú)序的,添加也不一定是添加在最后,可能出現(xiàn)在任何位置。字典中的單個(gè)元素由于字典和列表都是可以修改的數(shù)據(jù)類型,因此二者經(jīng)常一起使用來(lái)存儲(chǔ)和處理數(shù)據(jù)。如下語(yǔ)句創(chuàng)建了一個(gè)存放人口數(shù)據(jù)的列表:values=[{"CountryCode":"CHN","CountryName":"China","Value":667070000.0,"Year":1960},{"CountryCode":"CHN","CountryName":"China","Value":1392730000.0,"Year":2018}]列表中每個(gè)元素都是一個(gè)字典,包括國(guó)家代碼、國(guó)家名稱、值和年份四個(gè)鍵。雖然列表中的每個(gè)元素可以是任意值,但在存儲(chǔ)和處理數(shù)據(jù)時(shí),通常是同一種類型和結(jié)構(gòu)的數(shù)據(jù)。進(jìn)一步擴(kuò)展,該列表可以存放世界不同國(guó)家不同年份的人口數(shù)據(jù),我們既可以方便地查詢某個(gè)國(guó)家人口隨時(shí)間的變化,也可以方便地查詢某年不同國(guó)家人口的差異。字典的列表比較運(yùn)算符、邏輯運(yùn)算符、成員運(yùn)算符也適用于字典,本節(jié)介紹成員運(yùn)算符的使用。字典的成員運(yùn)算符用來(lái)判斷某個(gè)鍵是否在字典中,比如:想從字典CHN中查詢中國(guó)1980年的人口數(shù)據(jù),如果直接通過(guò)CHN[1980]來(lái)訪問(wèn),有可能因?yàn)殒I不存在而報(bào)錯(cuò),我們可以加一個(gè)判斷語(yǔ)句,如下所示:if1980inCHN:print(CHN[1980])如果1980存在,則輸出結(jié)果,如果不存在,什么也不輸出,程序也不會(huì)報(bào)錯(cuò)。4.2.2字典的運(yùn)算符和函數(shù)關(guān)于字典的內(nèi)置函數(shù),上一節(jié)介紹了dict()類型轉(zhuǎn)換函數(shù),本節(jié)介紹len()函數(shù)。len()函數(shù)適用于序列,也適用于字典,返回的是元素的個(gè)數(shù),也就是鍵值對(duì)的個(gè)數(shù)。但是我們并不能像列表那樣,把它用于for循環(huán)中,比如:foriinrange(len(CHN)):print(CHN[i])4.2.2字典的運(yùn)算符和函數(shù)因?yàn)樽值涞脑責(zé)o法通過(guò)索引號(hào)(下標(biāo))去訪問(wèn),CHN[i]中的i是鍵而不是索引號(hào),所以會(huì)出現(xiàn)鍵錯(cuò)誤。我們可以采用如下循環(huán)語(yǔ)句對(duì)字典中的元素進(jìn)行處理:foreachinCHN:print("%4d\t%12.1f"%(each,CHN[each])循環(huán)變量each遍歷CHN中的每個(gè)鍵,CHN[each]就是每個(gè)鍵的值,在循環(huán)體內(nèi)同時(shí)輸出鍵和值,分別按4位整數(shù)和12位小數(shù)(1位小數(shù)位)的格式輸出,結(jié)果如下:1960 667070000.02018 1392730000.04.2.2字典的運(yùn)算符和函數(shù)本章案例中假設(shè)變量values存儲(chǔ)了是世界各國(guó)1960~2018年的人口數(shù)據(jù),將中國(guó)、美國(guó)、英國(guó)、印度四國(guó)的人口數(shù)據(jù)找出來(lái)并存進(jìn)各自字典的代碼如下:CHN,USA,GBR,IND={},{},{},{}#字典,key是年,value是值foreachinvalues:ifeach['CountryCode']=='CHN':
CHN[each['Year']]=each['Value']
continueifeach['CountryCode']=='USA':
USA[each['Year']]=each['Value']
continueifeach['CountryCode']=='GBR':
GBR[each['Year']]=each['Value']
continueifeach['CountryCode']=='IND':
IND[each['Year']]=each['Value']4.2.2字典的運(yùn)算符和函數(shù)循環(huán)變量each遍歷values中的每個(gè)元素(對(duì)應(yīng)每條數(shù)據(jù)的一個(gè)字典),如果發(fā)現(xiàn)它的鍵'CountryCode'的值是'CHN',也就是中國(guó)的數(shù)據(jù),那么就向字典CHN中添加一個(gè)元素(鍵值對(duì)),鍵就是字典each中鍵'Year'的值,值就是each中鍵'Value'的值。clear()、copy()和pop()方法列表也有,其他方法均不同。get()方法用于獲取字典中的單個(gè)元素值,參數(shù)即為key,且比直接通過(guò)<dict>[key]的方式訪問(wèn)要好,如果key不存在,也不會(huì)報(bào)錯(cuò),默認(rèn)返回None,如果希望返回其他值,可以指定第二個(gè)參數(shù)。keys()、values()、items()方法的返回值均為可迭代對(duì)象,可以通過(guò)list()函數(shù)轉(zhuǎn)換成列表,分別存放字典的鍵列表、值列表、鍵值元組對(duì)列表。4.2.3字典的常用方法方法功能dict.clear()清空dict中的所有元素dict.copy()返回dict的一個(gè)復(fù)本dict.get(key,default=None)返回key對(duì)應(yīng)的值,如果key在dict中不存在,返回defaultdict.items()返回dict的所有(key,value)元組對(duì)的可迭代對(duì)象dict.keys()返回dict的所有鍵的可迭代對(duì)象dict.pop(key)刪除并返回key對(duì)應(yīng)的值,如果key在dict中不存在,出現(xiàn)鍵錯(cuò)誤dict.update(dict2)把dict2的鍵值對(duì)加入dict,如果鍵重復(fù)則覆蓋dict.values()返回dict的所有值的可迭代對(duì)象讀取一個(gè)文本文件(比如一本小說(shuō)),統(tǒng)計(jì)其中每個(gè)單詞出現(xiàn)的頻次,不考慮標(biāo)點(diǎn)符號(hào),單引號(hào)除外,比如“don’t”、“it’s”、“I’m”都是常用詞匯。輸出詞頻最高的n個(gè)單詞,n由用戶指定。【例4-1】詞頻統(tǒng)計(jì)【例4-1】詞頻統(tǒng)計(jì)將除單引號(hào)之外的所有標(biāo)點(diǎn)符號(hào)替換為空格,再調(diào)用split()方法將文本進(jìn)行分解,分解后的所有單詞存放在列表words中。構(gòu)建一個(gè)字典counts來(lái)進(jìn)行詞頻統(tǒng)計(jì),鍵就是出現(xiàn)的單詞,值就是這個(gè)單詞出現(xiàn)的次數(shù)。遍歷words中的每一個(gè)單詞w,如果是第一次碰到w,那么給字典counts添加一個(gè)元素,counts[w]賦值為1;如果不是第一次碰到,counts[w]累加1。調(diào)用zip()函數(shù)生成了一個(gè)元組對(duì)的列表freq,這個(gè)元組對(duì)的第一個(gè)元素是值(頻次),第二個(gè)元素是鍵(單詞),那么調(diào)用sort()方法就可以按照頻次進(jìn)行排序,指定參數(shù)reverse=True,即按降序排列。這樣,列表freq就對(duì)所有單詞按頻次進(jìn)行了排序,可以輸出了。用戶輸入n的值之后,輸出freq中前n個(gè)元素,格式符“%-15s”表示輸出單詞時(shí)保留15位空間,且左對(duì)齊。運(yùn)行程序,輸入要進(jìn)行詞頻統(tǒng)計(jì)的文件名,比如:“l(fā)ittle_women.txt”(小說(shuō)《小婦人》),再輸入要輸出多少個(gè)詞頻最高的單詞,比如:25。【例4-1】詞頻統(tǒng)計(jì)看一看string庫(kù)中punctuation都包含哪些標(biāo)點(diǎn)符號(hào),嘗試在程序中不引入常量punctuation,直接用字符串來(lái)表示。試一試4.3集合本節(jié)將介紹最后一種數(shù)據(jù)類型:集合。Python中的集合與數(shù)學(xué)中的集合有很多共同之處。4.3.1集合的表示集合(set)和字典一樣,是無(wú)序的,但其中的元素并不是鍵值對(duì),而是一個(gè)可哈希的值,且元素不重復(fù),和字典中的鍵一樣。創(chuàng)建集合集合也是用花括號(hào)表示的,所以要?jiǎng)?chuàng)建一個(gè)空集合,不能用一對(duì)花括號(hào)來(lái)表示,那樣會(huì)被認(rèn)為是空字典,只能通過(guò)類型轉(zhuǎn)換函數(shù)來(lái)創(chuàng)建。有兩種類型的集合,一種是可以修改的集合,另一種是不可修改的集合,類型轉(zhuǎn)換函數(shù)分別為set()和frozenset()。創(chuàng)建集合可以修改的集合類似列表,可以添加、刪除元素,不可修改的集合類似元組,不可以添加、刪除元素。注意:創(chuàng)建集合時(shí),其中的元素不能重復(fù),比如:s=set('cheese')結(jié)果s的值為{'h','e','c','s'}。集合中的單個(gè)元素集合與列表不同,它是無(wú)序的,因此無(wú)法通過(guò)索引號(hào)(下標(biāo))去訪問(wèn)單個(gè)元素;集合又與字典不同,它沒(méi)有鍵,因此也無(wú)法通過(guò)鍵去訪問(wèn)單個(gè)元素。我們只能通過(guò)成員運(yùn)算符去判斷某個(gè)元素是否在集合中,或者通過(guò)循環(huán)迭代的方式逐一訪問(wèn)其中的元素。4.3.2集合的運(yùn)算符和函數(shù)除了成員運(yùn)算符,比較運(yùn)算符、邏輯運(yùn)算符也適用于集合,除此之外,還有類似數(shù)學(xué)集合的集合運(yùn)算符。比較運(yùn)算符功能集合運(yùn)算符功能==相等&交集!=不等|并集<=子集-差集或相對(duì)補(bǔ)集<
嚴(yán)格子集^對(duì)稱差集>=超集
>
嚴(yán)格超集
4.3.2集合的運(yùn)算符和函數(shù)s是t的子集,t不是u的子集;t和u之間有交集,也有差集。注意:集合之間沒(méi)有連接運(yùn)算符“+”,兩個(gè)集合的連接可以使用并集運(yùn)算符。4.3.2集合的運(yùn)算符和函數(shù)關(guān)于集合的內(nèi)置函數(shù),上一節(jié)介紹了set()和frozenset()兩個(gè)類型轉(zhuǎn)換函數(shù),除此之外,len()函數(shù)也適用于集合,返回的也是元素的個(gè)數(shù)。和字典一樣,我們一般不把它用于for循環(huán)中,比如:foriinrange(len(s)):print(s[i])因?yàn)榧系脑責(zé)o法通過(guò)索引號(hào)(下標(biāo))去訪問(wèn),會(huì)出現(xiàn)類型錯(cuò)誤(TypeError)。4.3.3集合的常用方法方法功能s.add(obj)將obj添加至ss.clear()清空s中的所有元素s.copy()返回s的一個(gè)復(fù)本s.difference(t)返回s-ts.discard(obj)如果obj在s中,則刪除它ersection(t)返回s和t的交集s.issubset(t)如果s是t的子集,返回True,否則返回Falses.issuperset(t)如果s是t的超集,返回True,否則返回Falses.pop()刪除并返回s中任意一個(gè)對(duì)象s.remove(obj)從s中刪除obj,如果obj不在s中,出現(xiàn)鍵錯(cuò)誤s.symmetric_difference(t)返回s和t的對(duì)稱差集s.union(t)返回s和t的并集s.update(t)將t的元素添加進(jìn)s,如果元素重復(fù)則忽略4.3.3集合的常用方法add()、clear()、discard()、pop()、remove()、update()方法只適用于可以修改的set類型,不適用于不可修改的frozenset類型。clear()、copy()和pop()方法字典也有,其他方法均不同。4.4JSON文件本節(jié)介紹常用的數(shù)據(jù)文件之一:JSON文件。JSON(JavaScriptObjectNotation)是一種通用的輕量級(jí)的數(shù)據(jù)交換格式。JSON具有數(shù)據(jù)格式簡(jiǎn)單、讀寫(xiě)方便等優(yōu)點(diǎn),很多網(wǎng)站都會(huì)用到JSON格式來(lái)進(jìn)行數(shù)據(jù)的傳輸和交換。用Python處理JSON格式的數(shù)據(jù),首先要實(shí)現(xiàn)JSON格式與Python數(shù)據(jù)類型的相互轉(zhuǎn)換。JSON的數(shù)據(jù)結(jié)構(gòu)有兩種:對(duì)象結(jié)構(gòu)和數(shù)組結(jié)構(gòu),分別對(duì)應(yīng)Python的字典和列表,因此在Python中使用JSON非常簡(jiǎn)單,可以將JSON格式視為由列表和字典的自由嵌套組成的數(shù)據(jù)集合。4.4.1JSON格式4.4.1JSON格式Python數(shù)據(jù)類型說(shuō)明JSON數(shù)據(jù)類型說(shuō)明字典鍵值對(duì),花括號(hào)對(duì)象鍵值對(duì),花括號(hào)列表、元組方括號(hào)、圓括號(hào)數(shù)組方括號(hào)字符串雙引號(hào)、單引號(hào)字符串雙引號(hào)整型、浮點(diǎn)型
數(shù)字
布爾型True、False布爾型true、false空對(duì)象None空對(duì)象null以我們從DataHub上下載的世界各國(guó)1960年以來(lái)的人口、GDP和人均GDP數(shù)據(jù)集為例,其數(shù)據(jù)格式為:[{"CountryCode":"ARB","CountryName":"ArabWorld","Value":222.688851118821,"Year":1968},{"CountryCode":"ARB","CountryName":"ArabWorld","Value":238.909677072309,"Year":1969},…,{"CountryCode":"ZWE","CountryName":"Zimbabwe","Value":1029.07664867845,"Year":2016}]Python提供了json標(biāo)準(zhǔn)庫(kù)對(duì)JSON格式進(jìn)行編碼和解碼,引入它之后就可以調(diào)用其中的函數(shù)來(lái)進(jìn)行操作。4.4.2JSON庫(kù)函數(shù)功能函數(shù)功能dump(obj,f)解析obj,寫(xiě)入文件對(duì)象fload(f)讀取文件對(duì)象f,解析為Python對(duì)象dumps(obj)解析obj為JSON字符串loads()解析JSON字符串為Python對(duì)象dumps()和loads()互為解析將城市的緯度和經(jīng)度存入JSON文件。創(chuàng)建名為“l(fā)ocation_on_earth.json”的文件,存放北京、香港、上海、華盛頓特區(qū)4個(gè)城市的緯度和經(jīng)度數(shù)據(jù),如下所示:[{"City":"Beijing","Latitude":39.93,"Longitude":116.46},{"City":"Hongkong","Latitude":22.28,"Longitude":114.13},{"City":"Shanghai","Latitude":31.23,"Longitude":121.45},{"City":"WashingtonDC","Latitude":38.94,"Longitude":-77.05}]【例4-2】修改例2-2,從JSON文件中獲取數(shù)據(jù)【例4-2】修改例2-2,從JSON文件中獲取數(shù)據(jù)以只讀方式打開(kāi)文件,調(diào)用json庫(kù)的load()函數(shù)讀取文件的內(nèi)容存入points中。對(duì)JSON文件中存放的所有城市進(jìn)行循環(huán)迭代,判斷是否是起點(diǎn)或終點(diǎn)城市。如果是起點(diǎn)城市,給起點(diǎn)的緯度和經(jīng)度t1、g1賦值,如果是終點(diǎn)城市,給終點(diǎn)的緯度和經(jīng)度t2、g2賦值。計(jì)算兩點(diǎn)之間的距離后輸出。這里要解決的一個(gè)關(guān)鍵問(wèn)題是:如果用戶輸入的城市不在JSON文件中該如何處理?如果不做任何處理,程序會(huì)報(bào)錯(cuò),因?yàn)閠1、g1、t2、g2沒(méi)有被賦值。只要被賦值了,就說(shuō)明JSON文件中有這個(gè)城市。因此,給t1和t2賦初值為0,如果起點(diǎn)和終點(diǎn)在JSON文件中都存在,那么t1andt2的結(jié)果就為True,計(jì)算距離并輸出。如果有一個(gè)城市在JSON文件中不存在,那么t1andt2的結(jié)果就為False,執(zhí)行else分支。在else分支中,進(jìn)一步判斷是起點(diǎn)城市還是終點(diǎn)城市沒(méi)找到,并給用戶提示信息。【例4-2】修改例2-2,從JSON文件中獲取數(shù)據(jù)運(yùn)行程序,對(duì)不同情況進(jìn)行測(cè)試。【例4-2】修改例2-2,從JSON文件中獲取數(shù)據(jù)本章案例要從存放了世界各國(guó)1960年以來(lái)的人口、GDP和人均GDP的JSON文件中讀取數(shù)據(jù),首先要打開(kāi)文件對(duì)話框讓用戶選擇相應(yīng)的數(shù)據(jù)文件,代碼如下:fromtkinter.filedialogimportaskopenfilename#指定文件類型file_name=askopenfilename(filetype=[(‘JSONfiles’,‘*.json’)])f=open(file_name,'r')values=json.load(f)f.close()4.4.2JSON庫(kù)以只讀方式打開(kāi)文件后,調(diào)用json庫(kù)中的load()函數(shù)讀取數(shù)據(jù)并存放在變量values中,關(guān)閉文件。filedialog包中的askopenfilename()函數(shù)可以指定文件類型參數(shù),也就是在打開(kāi)文件對(duì)話框中限定文件類型,這個(gè)參數(shù)的值是一個(gè)列表,也就是可以限定多種文件類型,每種文件類型用一個(gè)二元組表示,二元組的第一個(gè)元素是表示文件類型的字符串,第二個(gè)元素是指定文件類型的格式,比如“*.json”表示后綴名為“json”的文件。這里,我們只限定了一種文件類型,因此列表里只有一個(gè)二元組。4.4.2JSON庫(kù)至此,本章案例除數(shù)據(jù)可視化部分已完成,將程序文件保存為ch04.py,運(yùn)行程序,如果有錯(cuò)誤則進(jìn)行修正。調(diào)用print()函數(shù)輸出結(jié)果。試一試pygal第三方庫(kù)的主要功能也是數(shù)據(jù)可視化,可以用來(lái)生成可縮放的矢量圖形文件(ScalableVectorGraphics,SVG),引入前也需要通過(guò)pip工具進(jìn)行安裝。4.5編程實(shí)踐:Pygal芝加哥期權(quán)交易所VIX指數(shù)用來(lái)衡量標(biāo)普500指數(shù)(S&P500)在未來(lái)30天的隱含波動(dòng)率,該指數(shù)也被稱為恐慌指數(shù),反映市場(chǎng)情緒和預(yù)期股市未來(lái)波動(dòng)性。我們從DataHub上搜集并下載了VIX數(shù)據(jù)集,包含2004年1月2日——2020年9月4日每日收盤(pán)、最高、最低和開(kāi)盤(pán)的數(shù)據(jù),并將數(shù)據(jù)文件命名為“vix_daily.json”,其格式和內(nèi)容如下:[{"Date":"2004-01-02","VIXClose":18.22,"VIXHigh":18.68,"VIXLow":17.54,"VIXOpen":17.96},…,{"Date":"2020-09-04","VIXClose":30.75,"VIXHigh":38.28,"VIXLow":29.5,"VIXOpen":34.62}]【例4-3】生成VIX指數(shù)時(shí)間序列圖【例4-3】生成VIX指數(shù)時(shí)間序列圖橫坐標(biāo)是日期,縱坐標(biāo)選取收盤(pán)數(shù)據(jù)。將dates和close賦為空列表,將每天的數(shù)據(jù)添加進(jìn)這兩個(gè)列表。由于數(shù)據(jù)較多,我們將每隔5天(一周)的數(shù)據(jù)存入列表。用Bar類來(lái)創(chuàng)建一個(gè)柱狀圖的對(duì)象實(shí)例bar,然后給bar的x軸賦值為dates,再設(shè)置x軸的主刻度的步長(zhǎng)為26,也即是每26個(gè)5天顯示一個(gè)標(biāo)簽。調(diào)用bar的add()方法添加y軸的數(shù)據(jù),即close。給bar的圖標(biāo)題、x軸的標(biāo)題和y軸的標(biāo)題分別賦值。調(diào)用bar的render_to_file()方法生成圖形文件。運(yùn)行程序,找到生成的VIX時(shí)間序列圖??梢钥吹剑瑱M坐標(biāo)的日期旋轉(zhuǎn)了-45度顯示,如果不旋轉(zhuǎn),日期標(biāo)簽會(huì)相互交叉,無(wú)法全部顯示出來(lái)。顯示出來(lái)的數(shù)據(jù)是每隔5天,x軸的主刻度是每隔26*5天?!纠?-3】生成VIX指數(shù)時(shí)間序列圖【例4-4】本章案例的實(shí)現(xiàn)用Line類來(lái)創(chuàng)建一個(gè)折線圖的對(duì)象實(shí)例line,然后給line的x軸賦值,即為年份,從CHN、USA、GBR、IND任意一個(gè)字典中獲取鍵列表即可,再設(shè)置x軸的主刻度的步長(zhǎng)為2,也即是每2年顯示一個(gè)標(biāo)簽。調(diào)用line的add()方法添加y軸的數(shù)據(jù),包括CHN、USA、GBR、IND四個(gè)字典的值列表。給line的x軸的標(biāo)題賦值為“year”,再給y軸的標(biāo)題賦值,最后調(diào)用line的render_to_file()方法來(lái)生成一個(gè)SVG圖形文件,并給出提示信息。由于本例對(duì)人口、GDP和人均GDP的數(shù)據(jù)集通用,y軸的標(biāo)題和生成的文件名對(duì)于不同的數(shù)據(jù)集有所不同。首先通過(guò)file_name獲得文件的路徑和名稱,調(diào)用字符串的split()方法按照路徑分隔符“/”分解,取出最后一個(gè)字串,即文件名稱,比如“gdp_pcap.json”;再次調(diào)用split()方法按照分隔符“.”分解,取
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《機(jī)床電氣控制與PLC》期末試卷-B卷
- 吉林藝術(shù)學(xué)院《流行音樂(lè)史Ⅱ》2021-2022學(xué)年第一學(xué)期期末試卷
- 吉林藝術(shù)學(xué)院《歌曲寫(xiě)作Ⅱ》2021-2022學(xué)年第一學(xué)期期末試卷
- 吉林師范大學(xué)《專業(yè)技法基礎(chǔ)應(yīng)用》2021-2022學(xué)年第一學(xué)期期末試卷
- 2024年大學(xué)宿舍分割協(xié)議書(shū)模板
- 吉林師范大學(xué)《現(xiàn)代教育技術(shù)》2021-2022學(xué)年第一學(xué)期期末試卷
- 委托代管三方協(xié)議書(shū)范文模板
- 合伙人合同協(xié)議書(shū)范文五份
- 餐飲企業(yè)場(chǎng)地租賃協(xié)議書(shū)范文
- 吉林師范大學(xué)《論語(yǔ)與管理》2021-2022學(xué)年第一學(xué)期期末試卷
- 海洋研學(xué)勞動(dòng)課程設(shè)計(jì)
- 林業(yè)基礎(chǔ)知識(shí)考試題庫(kù)單選題100道及答案解析
- 《汽車檢測(cè)與診斷技術(shù)》教學(xué)設(shè)計(jì)教案
- 人工智能驅(qū)動(dòng)的智能教育教學(xué)平臺(tái)服務(wù)合同
- 期中 (試題) -2024-2025學(xué)年譯林版(三起)英語(yǔ)四年級(jí)上冊(cè)
- GB/T 19228.1-2024不銹鋼卡壓式管件組件第1部分:卡壓式管件
- 第四單元基礎(chǔ)測(cè)試卷-2024-2025學(xué)年統(tǒng)編版語(yǔ)文六年級(jí)上冊(cè)
- 人教版2024七年級(jí)上冊(cè)英語(yǔ)各單元單詞短語(yǔ)句型匯編
- 2024年人教版九年級(jí)英語(yǔ)單詞默寫(xiě)單(微調(diào)版)
- 22G101三維彩色立體圖集
- 2024屆高考專題復(fù)習(xí):思辨類作文專題復(fù)習(xí)
評(píng)論
0/150
提交評(píng)論