说在前面
“奥运排行榜”是一个源于实际的排序问题,每个国家的信息是一条记录,包含编号、国家/地区、人口数量、各奖牌数等数据项,根据不同的排序标准,对各条记录进行排序。
(资料图片仅供参考)
教材程序采用一个二维数组来存储数据,每个元素表示一条记录,排序时可以对整条记录进行交换操作。教材还提供了“思考与练习”,继续研究不同数据结构和排序要求下,冒泡排序的不同实现方法,要求学生理解数据结构与算法的关系,值得深入探讨。
教材文本
教材处理
教材程序首先读取csv文件,再逐行将数据插入到二维数组a中,数组a的每个元素都是一个字符串列表,例如a[1]的值为["8", "中国", "136407", "51", "21", "28", "100"]。
程序在执行冒泡排序时,以金牌数为关键字进行降序排序,故需要先使用int()函数将a[j][3]转换成整数,再作比较。
因为a[0]的值是标题,所以不参与排序,这虽然能够解决问题,但造成了隐患,最好是不要把标题存储到a中,这样排序时就可以放心大胆地套用代码模板了。可以引导学生自行编程解决奥运排行榜问题,并比较其与教材程序的异同。
学生任务单
阅读教材P132例1“奥运排行榜”,思考如下问题:
(1)教材程序中变量a是何种数据结构?其元素值(例如a[3])是什么数据类型?
(2)教材程序是如何对数组a排序的?a[0]是否参与的排序?为什么?
(3)下列程序也能解决奥运排行榜问题,试比较其与教材程序的异同,并完成填空。
import csv
#数据读入
csvFile = open("jp.csv", "r") #打开相应数据文件
reader = list(csv.reader(csvFile)) # 转换成列表,以便跳过第一行
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
#数据写入
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个二维数组来存储数据,若改成以7个一维数组来存储数据,又该如何编程实现以金牌数为关键字进行降序排序功能?
参考代码如下,请将缺失的代码补充完整。
import csv
#数据读入
csvFile = open("jp.csv", "r") #打开相应数据文件
reader = list(csv.reader(csvFile)) #转换成列表,以便跳过第一行
a1 = [item[0] for item in reader[1:]] #编号
a2 = [填空1] #国家/地区
a3 = [item[2] for item in reader[1:]] #人口数量
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] #总数
#排序
for i in range(1,len(a1)):
for j in range(len(a1) - i):
if int(a4[j]) < int(a4[j+1]):
填空3(包含多行语句)
#数据写入
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个二维数组来存储数据,若将排序关键字改为“国民人均奖牌数”,并按升序排序,该如何编程实现以金牌数为关键字进行降序排序功能?
问题解析
(1)a是一个二维数组,其元素值是一个字符串数组,其中a[3]的值为["53", "美国", "32262", "36", "38", "36", "110"],a[3][3]也是一个字符串,可以使用int(a[3][3])将其转换成整数,表示金牌数量。
(2)书中程序采用冒泡排序算法,以金牌数为关键字,对数组a进行降序排序。因为a[0]存储的是标题,故不参与排序。程序的内层循环从下标1开始遍历数组,这样可以跳过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
#数据读入
csvFile = open("jp.csv", "r") #打开相应数据文件
reader = list(csv.reader(csvFile)) # 转换成列表,以便跳过第一行
a = []
for item in reader[1:]:
a.append(item)
csvFile.close()
#排序:关键字“国民人均奖牌数”,按升序排序
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]
#数据写入
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()
课后作业
任务(4)以7个一维数组来存储数据,当以金牌数为关键字进行降序排序时,不仅是对a4排序,其他6个数组的元素值也要相应变化,效率不高。因为这7个数组的结构一致,相同下标对应同一个国家,故我们可以增加一个索引数组b,专门用来存储这7个数组的下标,这样只需对索引数组b排序,数组a1-a7可以保持不变。输出数组元素时,只要设置正确的索引值,就能实现排序的效果。
这种排序方法被称为“索引排序”,参考代码如下,请将缺失的代码补充完整。
import csv
#数据读入
csvFile = open("jp.csv", "r") #打开相应数据文件
reader = list(csv.reader(csvFile)) #转换成列表,以便跳过第一行
a1 = [item[0] for item in reader[1:]] #编号
a2 = [填空1] #国家/地区
a3 = [item[2] for item in reader[1:]] #人口数量
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] #总数
b = [i for i in range(len(a1))] #设置索引数组
#排序
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
#数据写入
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算法之旅”知识星球汇集了数量众多的同好,更多有趣的话题在这里讨论,更多有用的资料在这里分享。
我们专注Python算法,感兴趣就一起来!
相关优秀文章:
阅读代码和写更好的代码
最有效的学习方式
Python算法之旅文章分类
-
“奥运排行榜”教学思路 最新
说在前面“奥运排行榜”是一个源于实际的排序问题,每个国家的信息是一条记录,包含编号、国家 地区、人口数量、各奖牌数等数据项,根据不同的
-
梵音瑜伽多家公司因劳动争议被起诉 全球信息
近日,知名瑜伽连锁机构梵音被曝拖欠员工工资,不少门店闭馆停业,消费者退费困难。对此,梵音瑜伽老板今日发文宣布停业整顿,并
-
夜生活之曲有多少任务_夜生活之曲
1、《侠盗猎车4:夜生活之曲》图文攻略游戏贴士:第一次进行游戏,过场动画建议不要按空格键跳过。2、避免出现BUG卡在LO
-
环球快资讯丨43股获20家以上机构调研 苏文电能最受关注
数据宝统计,近5个交易日(2月20日至2月24日)沪深两市约250家上市公司被机构调研。机构调研榜单中,共有43家公司获20家以上机构扎堆调研。苏文
-
经济日报丨灯光下升腾烟火气 世界今亮点
谢瑶灯火璀璨的店铺、琳琅满目的商品、熙熙攘攘的人流……今年以来,湖南“夜经济”热度持续攀升。2月18日,在长沙市开福区四
-
本周气温呈回暖趋势,申城今年入春或提前
回暖,是本周申城天气的主旋律。根据上海中心气象台发布的数据,未来10天,本市气温将呈上升趋势,体感比之前暖和不少,最高气温维持在13℃至1
-
水云间 世界热议
1、《水云间》是凤凰传奇演唱的一首歌曲,由于瑞洋作词作曲,收录在凤凰传奇2014年发行的专辑《最好的时代》中。2、201
-
停车位占道 骑车人难行 快看
本文转自:北京日报官悦欣园北侧新建路停车位占道骑车人难行官悦欣园北侧,停车位与隔离护栏间的距离过近。家住朝阳区王四营官悦欣园B区的袁先
-
02月26日从宁波出发到黄山的防疫政策 世界观焦点
02月26日从宁波出发到黄山的防疫政策(数据来源:本地宝)1、出宁波-:正常通行2、到黄山-:除养老院、福利院、医疗机构
-
今亮点!陈述性知识
1、陈述性知识,也叫“描述性知识”。2、它是指个人具有有意识的提取线索,而能直接加以回忆和陈述的知识。3、主要是用来说明
-
巨轮_说一说巨轮的简介
夏弥来为大家解答以下的问题,巨轮,说一说巨轮的简介,现在让我们一起来看看吧!1、《巨轮》(英语:Brother sKe
-
百亿私募掀调研热!13只票获超100家机构调研 这3只票成“香饽饽”!明星私募密集发新产品-环球百事通
春节之后,随着市场情绪的回暖以及疫情的逐渐褪去,机构投资者掀起了一轮“调研热”,尤其是线下调研迎来重启,部分个股接受数十家机构现场扎
-
今日报丨鲍丹
1、鲍丹(BardieBao),1991年2月8日出生于安徽省宣城市,中国内地女演员、歌手,毕业于深圳大学师范学院艺术
-
今日聚焦!桌面日历软件哪个好_4款桌面日历软件下载推荐
1 桌面桌面日历Desktopcal桌面日历是一款专门为桌面设计的桌面工具。桌面Cal桌面日历帮助您轻松管理桌面上的约会
-
每日动态!中华国学经典:儒林外史
1、《中华国学经典:儒林外史》是2019年8月团结出版社出版的图书。2、作者是吴敬梓(清)。文章到此就分享结束,希望
-
2022环粤港澳大湾区城市自行车挑战赛江门恩平站鸣枪
2022环粤港澳大湾区城市自行车挑战赛江门恩平站鸣枪
-
当前速看:02月26日06时湖北荆门昨日累计报告阳性感染者确诊971例 怎么判断自己是否属于轻型感染者
新型冠状病毒传播性强,不侥幸,不冒险,情谊常在,聚会不急一时。02月26日06时湖北荆门昨日累计报告阳性感染者确诊971例怎么判断自己是否属于
-
焦作十一中 快讯
1、焦作市第十一中学,创建于1962年,位于焦作市学生路中段。2、2003年被焦作市教育局评估为首批市级示范性普通高中,
-
四书是哪四书五经是哪五经_四书是哪四书
1、《大学》主条目:大学《大学》原本是《礼记》中一篇,在南宋前从未单独刊印。2、传为孔子弟子曾参(前505年—前43
-
能否延续?利物浦近7次英超客战水晶宫全胜,总比分22-6-播资讯
英超第25轮,利物浦将客战水晶宫,利物浦最近7次英超客战水晶宫全部取胜,总比分为22-6。最近7次英超客战水晶宫,利物浦全部取胜,期间打入22