每日快訊!“奧運排行榜”教學思路
說在前面
“奧運排行榜”是一個源于實際的排序問題,每個國家的信息是一條記錄,包含編號、國家/地區(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)閱讀
-
每日快訊!“奧運排行榜”教學思路
說在前面“奧運排行榜”是一個源于實際的排序問題,每個國家的信息... -
2022年“防疫賬本”批露,這一年,防疫...
近日,全國各省市陸續(xù)公布了2022年衛(wèi)生費用相關(guān)的統(tǒng)計數(shù)據(jù)。有22個... -
YOLOv8官方支持多目標跟蹤 | ByteTrac...
點擊下方卡片,關(guān)注「集智書童」公眾號點擊加入「集智書童-YOLO算法... -
老胡已瘋,他說公務員加班太辛苦|全球球...
拿什么來形容一下胡錫進呢?不太好說,他似乎陷入了某種混沌不清的... -
推薦十個優(yōu)秀的富文本編輯器 今日看點
前言富文本編輯器是一種可嵌入瀏覽器網(wǎng)頁中,所見即所得的文本編輯... -
世界新資訊:你的用戶珍貴么?殺雞吃肉...
最近越來越感受到,“用戶是否珍貴”,是考慮產(chǎn)品的各種策略時一個...