国产精品夜色视频一级区_hh99m福利毛片_国产一区二区成人久久免费影院_伊人久久大香线蕉综合影院75_国产精品久久果冻传媒

您的位置:首頁 >聚焦 >

每日快訊!“奧運排行榜”教學思路

2023-02-25 12:34:50    來源:程序員客棧

說在前面

“奧運排行榜”是一個源于實際的排序問題,每個國家的信息是一條記錄,包含編號、國家/地區(qū)、人口數(shù)量、各獎牌數(shù)等數(shù)據(jù)項,根據(jù)不同的排序標準,對各條記錄進行排序。

教材程序采用一個二維數(shù)組來存儲數(shù)據(jù),每個元素表示一條記錄,排序時可以對整條記錄進行交換操作。教材還提供了“思考與練習”,繼續(xù)研究不同數(shù)據(jù)結(jié)構(gòu)和排序要求下,冒泡排序的不同實現(xiàn)方法,要求學生理解數(shù)據(jù)結(jié)構(gòu)與算法的關(guān)系,值得深入探討。


(相關(guān)資料圖)

教材文本

教材處理

教材程序首先讀取csv文件,再逐行將數(shù)據(jù)插入到二維數(shù)組a中,數(shù)組a的每個元素都是一個字符串列表,例如a[1]的值為["8", "中國", "136407", "51", "21", "28", "100"]。程序在執(zhí)行冒泡排序時,以金牌數(shù)為關(guān)鍵字進行降序排序,故需要先使用int()函數(shù)將a[j][3]轉(zhuǎn)換成整數(shù),再作比較。因為a[0]的值是標題,所以不參與排序,這雖然能夠解決問題,但造成了隱患,最好是不要把標題存儲到a中,這樣排序時就可以放心大膽地套用代碼模板了??梢砸龑W生自行編程解決奧運排行榜問題,并比較其與教材程序的異同。

學生任務單

閱讀教材P132例1“奧運排行榜”,思考如下問題:(1)教材程序中變量a是何種數(shù)據(jù)結(jié)構(gòu)?其元素值(例如a[3])是什么數(shù)據(jù)類型?(2)教材程序是如何對數(shù)組a排序的?a[0]是否參與的排序?為什么?(3)下列程序也能解決奧運排行榜問題,試比較其與教材程序的異同,并完成填空。import csv#數(shù)據(jù)讀入csvFile = open("jp.csv", "r") #打開相應數(shù)據(jù)文件reader = list(csv.reader(csvFile)) # 轉(zhuǎn)換成列表,以便跳過第一行a = []for item in reader[1:]: a.append(item)csvFile.close()#排序for i in range(1,len(a)): for j in range(填空1): if 填空2: a[j], a[j+1] = 填空3#數(shù)據(jù)寫入csvFile2 = open("jp2.csv","w", newline="")writer = csv.writer(csvFile2, dialect="excel")writer.writerow(reader[0]) #先寫入標題for i in a: writer.writerow(填空4)csvFile2.close()(4)書中程序采用1個二維數(shù)組來存儲數(shù)據(jù),若改成以7個一維數(shù)組來存儲數(shù)據(jù),又該如何編程實現(xiàn)以金牌數(shù)為關(guān)鍵字進行降序排序功能?參考代碼如下,請將缺失的代碼補充完整。import csv#數(shù)據(jù)讀入csvFile = open("jp.csv", "r") #打開相應數(shù)據(jù)文件reader = list(csv.reader(csvFile)) #轉(zhuǎn)換成列表,以便跳過第一行a1 = [item[0] for item in reader[1:]] #編號a2 = [填空1] #國家/地區(qū)a3 = [item[2] for item in reader[1:]] #人口數(shù)量a4 = [item[3] for item in reader[1:]] #金牌a5 = [item[4] for item in reader[1:]] #銀牌a6 = [item[5] for item in reader[1:]] #銅牌a7 = [填空2] #總數(shù)#排序for i in range(1,len(a1)): for j in range(len(a1) - i): if int(a4[j]) < int(a4[j+1]): 填空3(包含多行語句)#數(shù)據(jù)寫入csvFile2 = open("jp2.csv","w", newline="")writer = csv.writer(csvFile2, dialect="excel")writer.writerow(reader[0]) #先寫入標題for i in range(len(a1)): writer.writerow(填空4)csvFile2.close()(5)依然采用1個二維數(shù)組來存儲數(shù)據(jù),若將排序關(guān)鍵字改為“國民人均獎牌數(shù)”,并按升序排序,該如何編程實現(xiàn)以金牌數(shù)為關(guān)鍵字進行降序排序功能?

問題解析

(1)a是一個二維數(shù)組,其元素值是一個字符串數(shù)組,其中a[3]的值為["53", "美國", "32262", "36", "38", "36", "110"],a[3][3]也是一個字符串,可以使用int(a[3][3])將其轉(zhuǎn)換成整數(shù),表示金牌數(shù)量。

(2)書中程序采用冒泡排序算法,以金牌數(shù)為關(guān)鍵字,對數(shù)組a進行降序排序。因為a[0]存儲的是標題,故不參與排序。程序的內(nèi)層循環(huán)從下標1開始遍歷數(shù)組,這樣可以跳過a[0]。

(3)填空1:len(a) - i;

填空2:int(a[j][3]) < int(a[j+1][3]);

填空3:a[j+1], a[j];

填空4:i。

(4)填空1:item[1] for item in reader[1:];

填空2:item[1] for item in reader[1:];

填空3: a1[j], a1[j+1] = a1[j+1], a1[j]

a2[j], a2[j+1] = a2[j+1], a2[j]

a3[j], a3[j+1] = a3[j+1], a3[j]

a4[j], a4[j+1] = a4[j+1], a4[j]

a5[j], a5[j+1] = a5[j+1], a5[j]

a6[j], a6[j+1] = a6[j+1], a6[j]

a7[j], a7[j+1] = a7[j+1], a7[j]

填空4:[a1[i],a2[i],a3[i],a4[i],a5[i],a6[i],a7[i]]。

(5)參考代碼如下:

import csv

#數(shù)據(jù)讀入

csvFile = open("jp.csv", "r") #打開相應數(shù)據(jù)文件

reader = list(csv.reader(csvFile)) # 轉(zhuǎn)換成列表,以便跳過第一行

a = []

for item in reader[1:]:

a.append(item)

csvFile.close()

#排序:關(guān)鍵字“國民人均獎牌數(shù)”,按升序排序

for i in range(1,len(a)):

for j in range(len(a) - i):

if int(a[j][6])/int(a[j][2]) > int(a[j+1][6])/int(a[j+1][2]):

a[j], a[j+1] = a[j+1], a[j]

#數(shù)據(jù)寫入

csvFile2 = open("jp2.csv","w", newline="")

writer = csv.writer(csvFile2, dialect="excel")

writer.writerow(reader[0]) #先寫入標題

for i in a:

writer.writerow(i)

csvFile2.close()

課后作業(yè)

任務(4)以7個一維數(shù)組來存儲數(shù)據(jù),當以金牌數(shù)為關(guān)鍵字進行降序排序時,不僅是對a4排序,其他6個數(shù)組的元素值也要相應變化,效率不高。因為這7個數(shù)組的結(jié)構(gòu)一致,相同下標對應同一個國家,故我們可以增加一個索引數(shù)組b,專門用來存儲這7個數(shù)組的下標,這樣只需對索引數(shù)組b排序,數(shù)組a1-a7可以保持不變。輸出數(shù)組元素時,只要設置正確的索引值,就能實現(xiàn)排序的效果。

這種排序方法被稱為“索引排序”,參考代碼如下,請將缺失的代碼補充完整。

import csv#數(shù)據(jù)讀入csvFile = open("jp.csv", "r") #打開相應數(shù)據(jù)文件reader = list(csv.reader(csvFile)) #轉(zhuǎn)換成列表,以便跳過第一行a1 = [item[0] for item in reader[1:]] #編號a2 = [填空1] #國家/地區(qū)a3 = [item[2] for item in reader[1:]] #人口數(shù)量a4 = [item[3] for item in reader[1:]] #金牌a5 = [item[4] for item in reader[1:]] #銀牌a6 = [item[5] for item in reader[1:]] #銅牌a7 = [填空2] #總數(shù)b = [i for i in range(len(a1))] #設置索引數(shù)組#排序for i in range(1,len(a1)): for j in range(len(a1) - i): if int(a4[b[j]]) < int(a4[b[j+1]]): 填空3#數(shù)據(jù)寫入csvFile2 = open("jp2.csv","w", newline="")writer = csv.writer(csvFile2, dialect="excel")writer.writerow(reader[0]) #先寫入標題for i in range(len(a1)): writer.writerow(填空4)csvFile2.close()

需要本文word文檔、源代碼和課后思考答案的,可以加入“Python算法之旅”知識星球參與討論和下載文件,“Python算法之旅”知識星球匯集了數(shù)量眾多的同好,更多有趣的話題在這里討論,更多有用的資料在這里分享。

我們專注Python算法,感興趣就一起來!

相關(guān)優(yōu)秀文章:

閱讀代碼和寫更好的代碼

最有效的學習方式

Python算法之旅文章分類

關(guān)鍵詞: 存儲數(shù)據(jù) 降序排序 數(shù)據(jù)文件

相關(guān)閱讀