<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          “奧運(yùn)排行榜”教學(xué)思路

          共 4823字,需瀏覽 10分鐘

           ·

          2023-02-25 12:26

          說(shuō)在前面

          “奧運(yùn)排行榜”是一個(gè)源于實(shí)際的排序問(wèn)題,每個(gè)國(guó)家的信息是一條記錄,包含編號(hào)、國(guó)家/地區(qū)、人口數(shù)量、各獎(jiǎng)牌數(shù)等數(shù)據(jù)項(xiàng),根據(jù)不同的排序標(biāo)準(zhǔn),對(duì)各條記錄進(jìn)行排序。

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

          教材文本

          教材處理

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

          學(xué)生任務(wù)單

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

          問(wèn)題解析

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

          (2)書(shū)中程序采用冒泡排序算法,以金牌數(shù)為關(guān)鍵字,對(duì)數(shù)組a進(jìn)行降序排序。因?yàn)閍[0]存儲(chǔ)的是標(biāo)題,故不參與排序。程序的內(nèi)層循環(huán)從下標(biāo)1開(kāi)始遍歷數(shù)組,這樣可以跳過(guò)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")  #打開(kāi)相應(yīng)數(shù)據(jù)文件

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

          a = [] 

          for item in reader[1:]:

              a.append(item)

          csvFile.close()

          #排序:關(guān)鍵字“國(guó)民人均獎(jiǎng)牌數(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ù)寫(xiě)入

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

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

          writer.writerow(reader[0]) #先寫(xiě)入標(biāo)題

          for i in a:

              writer.writerow(i)

          csvFile2.close()

          課后作業(yè)

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

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

          import csv
          #數(shù)據(jù)讀入
          csvFile = open("jp.csv", "r")         #打開(kāi)相應(yīng)數(shù)據(jù)文件
          reader = list(csv.reader(csvFile))    #轉(zhuǎn)換成列表,以便跳過(guò)第一行
          a1 = [item[0] for item in reader[1:]] #編號(hào)
          a2 = [填空1] #國(guó)家/地區(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è)置索引數(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ù)寫(xiě)入
          csvFile2 = open('jp2.csv','w', newline='')
          writer = csv.writer(csvFile2, dialect='excel')
          writer.writerow(reader[0]) #先寫(xiě)入標(biāo)題
          for i in range(len(a1)):
              writer.writerow(填空4)
          csvFile2.close()

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

          我們專(zhuān)注Python算法,感興趣就一起來(lái)!

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

          閱讀代碼和寫(xiě)更好的代碼

          最有效的學(xué)習(xí)方式

          Python算法之旅文章分類(lèi)

          瀏覽 57
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  中文字幕++中文字幕明步 | 中文字幕无码视频免费 | 不卡的a12在线观看 | 欧美天堂视频 | 黄色片在线免费观看91 |