内容正文:
高效作业3[第3课 数组2——二维数组](见学生用书P168)
【A级 新教材落实与巩固】
1.有如下Python程序段:
n=4
a=[[j*n+i+1 for i in range(n)]for j in range(n)]
for i in range(1,n):
for j in range(n//2):
a[i][j],a[i][n-j-1]=a[i][n-j-1],
a[i][j]
执行该程序段后,a[1][1]和a[2][1]的值分别为( D )
A.6和10 B.7和10
C.6和11 D.7和11
【解析】 二维数组a中生成的数组元素是[[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]],程序中的循环结构把每一行前后对称位置上的元素交换,故输出a[1][1]和a[2][1]的值为7和11。选项D正确。
2.有一个6行4列的数组a以行优先的方式存储在k个连续存储单元中,其中每个元素占8个存储单元,如果已知a[0][0]的首地址为1000,则a[3][2]的首地址为( A )
A.1112 B.1160 C.1104 D.1080
【解析】 以行优先的方式存储.每行共4个数据项,a[3][2]前共有3行2列,因此共有3*4+2=14个数据项,共占14*8=112个存储单元,首元素地址为1000+112=1112,选项A正确。
3.在二维数组a中,每个元素所占空间大小为8个字节,行下标i从0到4,列下标j从0到5,从首地址SA开始连续存放在存储器内,存放该数组需要的存储空间为( D )
A.20 B B.30 B C.160 B D.240 B
【解析】 总共有5行6列,共30个元素,每个元素8个字节,共240个字节,选项D正确。
4.有如下Python程序段:
a=[[0]*4]*3
b=[[0]*4 for i in range(3)]
a[2][3]=8
b[2][3]=8
执行该程序段后,下列说法正确的是( C )
A. a[0][3]的值为0,b[0][3]的值为0
B. a[0][3]的值为0,b[0][3]的值为8
C. a[0][3]的值为8,b[0][3]的值为0
D.a[0][3]的值为8,b[0][3]的值为8
【解析】 若使用语句a=[[0]*4]*3来创建,则在修改某行元素时,3行中同一列数据会同时被修改,则a[0][3]的值为8,选项C正确。
5. 有如下Python程序段:
a=[[i+1 for i in range(4)] for j in range(3)]
for i in range(3):
for j in range(4):
a[i][j]=a[i][j]+4*i
执行该程序段后,a[1][2]的值为( C )
A.2 B.4 C.7 D.8
【解析】 程序运行后列表a的值为:[[1,2,3,4],[5,6,7,8],[9,10,11,12]],选项C正确。
6.有如下Python 程序段:
li=[[”a”,10],[”b”,20],[”c”,30]]
dic={}
for i in range(len(li)):
dic[li[i][0]]=li[i][1]
print(dic)
执行该程序段后,输出的结果是( D )
A.{'a',10,'b',20,'c',30}
B.{10,20,30}
C.{['a','b','c'],[10,20,30]}
D.{'a':10,'b':20,'c':30}
【解析】 通过遍历列表li,依次取出元素[”a”,10],[”b”,20], [”c”,30],将各列表元素索引为0的位置作为key,将各列表元素索引为1的位置作为value。最后输出的dic为{”a”:10,”b”:20,”c”:30},选项D正确。
7.小明将我国部分省会城市及其对应的市花存储到二维数组中,并依次输出各省会城市名称及其市花,例如“杭州市的市花是桂花”。相关Python程序如下:
a=[[”杭州市”,”桂花”], [”广州市”,”木棉”],[”郑州市”,”月季”],[”武汉市”,”梅花”],[”长沙市”,”杜鹃”]]
for p in a:
print(①________+”的市花是”+②________)
则①、②处填入的代码分别为( B )
A. ①p[1] ②p[0]
B. ①p[0] ②p[1]
C. ①a[i][0] ②a[i][1]
D.①a[i][1] ②a[i][0]
【解析】 p表示每一个小列表,则p[0]表示省会城市,p[1]表示市花,选项B正确。
8.九宫格游戏规则: 1 至9 九个数字, 横竖都有3 个格,每行、每列、主对角、副对角的所有元素之和均为15,其中一组数据如列表list 所示。list=[[8,1,6],[3,5,7],[4,9,2]],执行下列Python 程序段后, 结果不能构成九宫格数据的是( D )
8
1
6
3
5
7
4
9
2
A.list1=[[0,0,0], [0,0,0], [0,0,0]]
for x in range(3):
for y in range(3):
list1[x][y]=list[y][x]
for i in list1:
print(i)
B.list1=[””,””,””]
for x in range(3):
list1[x]=list[x][::-1]
for i in list1:
print(i)
C.list1=[[0,0,0], [0,0,0], [[0,0,0]]
for x in range(3):
for y in range(3):
list1[x][y]=list[y][2-x]
for i in list1:
print(i)
D.list1=[[0,0,0], [0,0,0], [0,0,0]]
for x in range(3):
for y in range(3):
list1[x][y]=list[x-2][y]
for i in list1:
print(i)
【解析】 运行结果如下:
A
B
C
D
[8,3,4]
[1,5,9]
[6,7,2]
[6,1,8]
[7,5,3]
[2,9,4]
[6,7,2]
[1,5,9]
[8,3,4]
[3,5,7]
[4,9,2]
[8,1,6]
选项D斜线相加值不是15,选项符合题意。
9.2023·黄岩中学检测蒙特卡罗法是一类基于概率,通过使用随机数来解决某些计算问题的方法。如图所示,在平面上有k 个圆,可以使用蒙特卡罗方法求这些圆所占的近似总面积。(注:重叠部分仅计算一次,不重复计算)具体算法如下。
(1)建立一个直角坐标系,测得每个圆的坐标位置和半径;
(2)用一个矩形包围所有的k 个圆,设该矩形的长和宽分别为m 和n;
(3)在矩形范围内产生v 个随机点;
(4)统计落在圆内或圆弧上的随机点的数量并存入变量cnt;
(5)根据cnt 占所有随机点的比例,计算所有圆的近似总面积S=矩形面积×(cnt÷v)。
请在横线处填入合适的代码。
提示:平面上两个坐标点(x1,y1)和(x2,y2)的距离=
from math import sqrt
import random
#测量矩形的长度、宽度、圆的个数,存入变量m、n、k,代码略
v=int(input()) #读入随机点的数量,数量越多,精度越高
cir=[]
for i in range(k):#依次测量每个圆的坐标点(x,y)及半径r,存在列表cir中
cir.append([x,y,r])
def dis(x1,y1,x2,y2): #计算两个坐标点的距离,参考题目中给出的公式
d=①__sqrt((x1-x2)**2+(y1-y2)**2)__
return d
def check(x,y):
flag=False
for i in range(k):
if dis(x,y,cir[i][0],cir[i][1])<=cir[i][2]:#判断点是否在圆内或圆上
flag=True
break
②__return__flag__
cnt=0
for i in range(v):
x=random.uniform(0,n) #产生当前随机点的x 坐标
y=random.uniform(0,m) #产生当前随机点的y 坐标
if check(x,y):
cnt+=1
③__s=n*m*(cnt/v)__
print(round(s,2)) #输出近似总面积,四舍五入保留两位小数
【解析】 ①函数dis()的作用是计算两个坐标点的距离,参考题目中给出的公式,得到答案。②函数check()判断产生的点是否在圆内或圆弧上,若是则flag=True,否则flag=False,最后返回函数值。③计算所有圆的近似总面积S=矩形面积×(cnt÷V)。
10.九宫格游戏是一款数字游戏,简易的数字九宫格是将1~9这9个数字填写在3×3的矩阵中,使得矩阵的每一行、每一列、每一对角线的数字之和均为15,同一组合中所有数字不允许重复,下图所示就是一种可能的结果:
8
3
4
1
5
9
6
7
2
其在列表d中以如下形式存储:
d=[[8,3,4],[1,5,9],[6,7,2]]。现要编程实现输出九宫格所有可能组合,Python程序代码如下:
d=[[0,0,0],[0,0,0],[0,0,0]]
d[1][1]=5 #正中间一格元素必定为5
shu=[1,2,3,4,6,7,8,9] #剩下8个格子数字列表
for i in range(len(shu)): #枚举第一行第1个数字
for j in range(len(shu)): #枚举第一行第2个数字
if i==j:
continue #结束当前循环,继续下次循环
d[0][0]=shu[i]
d[0][1]=shu[j]
d[0][2]=①__15-d[0][0]-d[0][1]__或15-shu[i]-shu[j]__
if d[0][2]==d[0][0] or d[0][2]==d[0][1]or d[0][2]not in shu:
continue
else:
d[2][2]=10-d[0][0]
d[2][1]=10-d[0][1]
d[2][0]=10-d[0][2]
d[1][0]=15-d[0][0]-d[2][0]
d[1][2]=15-d[0][2]-d[2][2]
if (d[1][0] not in shu) or (d[1][2] not in shu):
continue
if d[1][0]+d[1][1]+d[1][2]!=15:
continue
if d[0][0]+d[1][0]+d[2][0]!=15:
continue
if d[0][2]+d[1][2]+d[2][2]!=15:
continue
lst=[ ]
ss=””
for m in range(3):
s=”” #每行输出字符初始化为空
for n in range(3):
s=s+” ”+str(d[m][n])
lst.②__append(d[m][n])__
ss=ss+s+”
” # ”
”表示换行
lst.sort(reverse=False) #对列表lst升序排序
lst.remove(5) #移除列表中值为5的元素
if ③__shu==lst__或lst==shu__:
print(ss) #输出一组符合要求的结果
(1)列表d=[[6,7,2],[9,5,1],[8,3,4]]是否是一种有效组合:__B__(单选,填字母:A.是/B.否)。
(2)请在横线处填入合适的代码。
【解析】 (1)[6,7,2]
[9,5,1]
[8,3,4]
第1列的值大于15,不是一个有效组合。
(2)①3个数字之和为15,则第3个数值可以是15减去前两个数。②将每个格子的数据放入lst。③将lst排序后,删除元素5,此时与shu列表相等,则满足条件。
11.2023·温州中学检测魔术探秘:有一个猜数字的魔术,魔术师让观众心中默想一个小于50 的两位数,接着问该观众,在如图1 所示的6 张卡片中哪几张有他想的数。最后,魔术师总能准确地猜出这个数。
小温学习了信息编码相关知识后,很快发现了该魔术的奥秘。他发现卡片1 中所有的数字转成二进制后最低位都是1,卡片2 的所有数字转成二进制后倒数第二位(从最低位开始数第二位)的数字都是1,卡片3 的所有数字转成二进制后倒数第三位(从最低位开始数第三位)的数字都是1……以此类推。现编写程序,验证小温的想法,运行结果如图2 所示,程序代码如下,请回答下列问题。
def judge(a,i): #参数a 代表需要验证卡片的数据列表,参数i 代表卡片编号
flag=False
ans=0
for j in a:
k=j//2**(i-1)
ans+=①__k%2__
if ans==len(a):
②__flag=True__或flag=not__flag__
return flag
a=[[1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41,43,45,47,49],[2,3,6,7,10,11,14,15,18,19,22,23,26,27,30,31,34,35,38,39,42,43,46,47,50],[4,5,6,7,12,13,14,15,20,21,22,23,28,29,30,31,36,37,38,39,44,45,46,47],[8,9,10,11,12,13,14,15,24,25,26,27,28,29,30,31,40,41,42,43,44,45,46,47],[16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,48,49,50],[32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50]]
for i in range(6): #依次验证卡片1 到卡片6
if ③__judge(a[i],i+1)__或judge(a[i],i+1)==True__:
print('卡片'+str(i+1)+'验证成功')
(1)请在横线处填入合适的代码。
(2)小温的父亲的年龄在50 岁以下,其年龄仅在卡片1、卡片3、卡片4、卡片6 出现过,则小温父亲的年龄为__45__(填数字)岁。
【解析】 (1)函数judge()用于判断每张卡片是否符合要求,即i卡片的每个倒数i为1(ans==len(a)),ans记下1的个数,语句k=j//2**(i-1)是移位操作,去除i位之后的数字;则①处是求出i位置上的数字,并累加到ans中;②处,如果相等,则flag设为True;③处是调用函数judge(),参数是卡片编号和对应卡片内容,由于i从0开始,所以卡片位置需要加1。
(2)根据题意确定二进制值为101101,转换为十进制为45。
12. 某单板滑雪大跳台比赛有8 名选手晋级决赛,决赛选手按出场顺序进行三轮表演,选手每次表演后,取其已完成表演的最佳成绩为其得分。6名裁判对运动员的空中动作、飞行距离、着陆等进行打分,满分为100分,去掉一个最高分,去掉一个最低分,选手每次表演分数为剩下4名裁判打分的平均分。现用Python 编写程序,现场根据评委打分,快速呈现出比赛选手的得分。
(1)3 号选手的得分情况如下:第一轮6名裁判打分分别为78、80、86、72、88、80,第二轮裁判打分分别为77、76、78、69、82、79,第三轮裁判打分分别为80、80、81、85、77、89,则3号选手的第二轮表演后的得分为__81__。
(2)请在横线处填入合适的代码。
maxn=8 #晋级决赛的人数
dic={1:”张无忌”,2:”赵敏”,3:”周芷若”,4:”张三丰”,5:”宋青书”,6:”金毛狮王”,7:”杨逍”,8:”小昭”} #字典dic 存储决赛选手的出场顺序及姓名
score=[[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0, 0, 0]] #列表score 依次存储每名出场选手的3 轮表演得分
#例如score[1][1]存储2 号选手第二轮表演得分
i=0
while i<maxn*3:
r=i//maxn
order=i%maxn
cj=input(”请输入各评委的评分: ”) #每位评委的评分之间用空格分隔
list_cj=cj.split()
numlist=list(map(int,list_cj))#将列表中各元素转换成整型并存储在列表numlist 中
tmp=sum(numlist)-max(numlist)-①__min(numlist)__
tmp_score=tmp/(len(list_cj)-2)
②__score[order][r]__=tmp_score
print(str(order+1)+”号选手”+dic[order+1]+”得分:”+③__str(max(score[order]))__)
i+=1
【解析】 (1)由题意可知,第一轮表演结束后分数为81,第二轮表演结束后分数不及第一轮高,则呈现的分数为第一轮分数。
(2)①由题意可知,本行代码求的是当前这一轮的总分数,需要减去一个最高分,减去一个最低分。当前这一空求numlist里的最低分,使用函数min()来完成。②将本轮成绩放入到二维数组score中, 其第一个下标为第几名选手,第二个下标为第几轮的得分。因此,该题答案为score[order][r]。③每次输出的是其三轮成绩中最高的分数,因此其答案为求当前这名选手的最高分max(score[order]),因为是要输出,因此还需要将其改成字符串格式。
【B级 素养形成与评价】
13.某高中的高二年级一共有16个班举行篮球比赛,每个班都与其他班级各进行一场比赛,赢一场比赛可增加1点积分,平局或者输掉比赛不扣积分,以最后的积分决定冠军、亚军和季军。如果两个班级胜场数相同,则输场数更少的班级排名更高;如果胜场数和输场数都相同,则两个班级排名相同。小文想用Python程序来模拟16个班级的比赛情况,首先初始化16个班级比赛积分情况,初始化界面如图1所示,某次运行代码后,16个班级的比赛情况如图2所示。
图1
图2
每个班级与其他班级的比赛结果是随机生成的,0表示平局,-1表示输掉比赛,1表示赢得比赛,第一行数据表示1班对战16个班的比赛结果(每个班和自己的对战结果都用平局表示)。
实现该功能的Python程序如下,请在横线处填入合适的代码。
import random
import pandas as pd
s=[[0 for i in range(16)]for j in range(16)] #生成16*16的二维列表(图1所示)
k=[];n=[]
m=[[1,0,0],[2,0,0],[3,0,0],[4,0,0],[5,0,0],[6,0,0],[7,0,0],[8,0,0],[9,0,0],[10,0,0],[11,0,0],[12,0,0],[13,0,0],[14,0,0],[15,0,0],[16,0,0]]
#列表m[1,0,0]中第一个元素表示第几班,第二个元素表示胜场数,第三个元素表示输场数,以此类推
for i in range(1,16):
for j in range(i):
s[i][j]=random.randint(-1,1)
①__s[j][i]=s[i][j]__
df=pd.DataFrame(s,index=[”1班”,”2班”,”3班”,”4班”,”5班”,”6班”,”7班”,”8班”,”9班”,”10班”,”11班”,”12班”,”13班”,”14班”,”15班”,”16班”],columns=[”1”,”2”,”3”,”4”,”5”,”6”,”7”,”8”,”9”,”10”,”11”,”12”,”13”,”14”,”15”,”16”])
print(df) #生成16个班的对战结果
for i in range(16):
for j in range(16):
if s[i][j]==1:
m[j][1]+=s[i][j]
elif s[i][j]==-1:
②__m[j][2]+=-s[i][j]或m[j][2]=m[j][2]+(-s[i][j])__
#对生成的列表m里的16个班级的数据进行排序,以胜场数作为主要关键词进行降序排序,以输场数作为次要关键词进行升序排序,使m列表中的元素按照班级排名从高到低的顺序依次排列。代码略
i=0
while i<15:
n.append(m[i][0])
for j in range(i+1,16):
if ③__m[i][1]==m[j][1]__and__m[i][2]==m[j][2]__:
n.append(m[j][0])
else:
break
k.append(n)
n=[];i=j
print(”获得冠军的班级有: ”,k[0],”班, 获得亚军的班级有: ”,k[1],”班, 获得季军的班级有: ”,k[2],”班”)
【解析】 ①沿对角线上下对称,行列互换得到答案。②列表m的元素[1,0,0]中,第一个元素表示第几班,第二个元素表示胜场数,第三个元素表示输场数,当s[i][j]==1成立时,m[j][1]中增加胜场数;当s[i][j]==-1时,m[j][2]中增加胜场数,由于是负数,需要取反。③胜场数和输场数一样,则名次相同,先放入n列表中,再将n列表放入k列表中。
14.2023·台州中学检测某校举办国庆师生联欢活动, 活动时给每位师生发放一个号码(由6个不重复的大写字母组成),在活动结束时将从已发放的号码中产生幸运号码。幸运号码的产生过程如下:
①将每个发放的号码与其他所有号码进行对比,找出该号码的亲密号码, 如两号码为亲密号码关系, 则两号码为一对亲密号码对。
亲密号码:若调换号码1中两个位置上的字符后得到的号码与号码2完全相同, 则称号码1与号码2是一对亲密号码对。如号码“ABCDEF”,调换其位置3和位置5中的字符“C”“E”得到号码“ABEDCF”, 即号码“ABCDEF”和“ABEDCF”为一对亲密号码对。
②在所有亲密号码对中, 找出出现次数最多的号码作为幸运号码,若出现次数最多的号码有多个, 则均作为幸运号码。
请回答下列问题。
(1)如号码分别是“ABCDEF”“ABEDCF”,“AFEDCB”“ADBCEF”, 则获奖号码为__ABEDCF__。
(2)初步处理后的号码数据保存在文件“编号.txt”中,如下图所示,实现上述功能的Python如下,请在横线处填入合适的代码。
#判断x,y是否是亲密号码对,如果是返回True,不是则返回False
def judge(x,y):
a=[]
for i in range (len (x)):
if x[i]!=y[i]:
a.append([x[i],y[i]])
if:
return True
else:
①__return__False__
f=open(”编号txt”,”r”) #打开文件
bh=f.read().split(”,”) #把各号码存储到列表bh中
#在列表bh中逐一比对所有号码,找到一对亲密号码,将这对号码存储到列表qmbh中
qmbh=[]
for i in range(len(bh)-1):
for j in range(i+1,len(bh)):
if ②__judge(bh[i],bh[j])__:
qmbh.append([bh[i],bh[j]])
cs={}
#遍历列表qmbh中的亲密号码对,统计各号码出现的次数,将结果存放在字典cs中
for bh_dui in qmbh:
for j in bh_dui:
if j in cs:
③__cs[j]+=1__
else:
cs[j]=1
#找出在亲密号码对中出现次数最多的号码
for key,value in cs.items():
if value==max (cs.values()):
print(”获奖编号为”,key)
print (f”与{key}为亲密编号的共{value}个”)
(3)程序段中加框处代码有误,请改正:__len(a)==2__and__a[0][0]==a[1][1]__and__a[0][1]==a[1][0]__。
【解析】 (1)ABEDCF与ABCDEF、AFEDCB是亲密数,出现次数最多。
(2)读取文件,并将其转换为列表bh;接着在列表bh中逐一比对所有号码,找到一对亲密号码就将这对号码存储到列表qmbh中,qmbh的结构为[[,],[,],…,[,]];②处调用judge()函数,判断x, y是否是亲密号码对;judge()函数的功能为:当两个号码不同时,存入列表a中,当不同个数等于2个,且交替相等,返回True,否则返回False;利用桶的思维统计亲密数个数,其中桶使用字典实现,如果j in cs(即在字典中),则次数增加1次,否则添加新的字典元素。
15.2023·温岭中学检测某校工会组织包粽子比赛,为体现团队协作精神,每个工会小组派5名选手参加,以接力赛形式完成15个粽子的制作,要求每名选手至少包1个,最多包5个,且只能上场一次。现在高二年级组的5名选手的包粽子成绩保存在文件“data.txt”中,如图1所示:
文件数据共5行6列,每行数据分别是某选手的编号、该选手累计包1到5个粽子的耗时(由于劳累因素等影响,连续包的粽子越多,速度越慢或不变,绝不会变快)。请利用Python编程设计方案,分配每名选手需要包的粽子个数,使小组接力用时最短(接力时的换人时间忽略不计)。运行界面如图2所示:
f=open(”①__data.txt__”,”r”) #数据文件与程序文件在同一目录
a=[]
c=[1]*5 #每名选手至少包1个粽子
for line in f.readlines():
t=line.split() #将以空格分隔的数字字串存储在列表t
score=list(map(int,t)) #将列表各元素转换成整数存储在列表score中
a.append(score)
pos=-1
ans=0
b=[[0],[0],[0],[0],[0]] #b[i][j]表示第i名选手包第j个粽子所需的时间
for i in range(0,5):
b[i].append(a[i][1])
for j in range(2,6):
b[i].append(②__a[i][j]-a[i][j-1]__或其他等价答案__)
for i in range(10): #每名选手至少包1个粽子,另10个粽子需分配
minx=1000000
for j in range(5):
if b[j][c[j]+1]<minx and c[j]+1<=5:
pos=j
③__minx=b[j][c[j]+1]__或其他等价答案____
c[pos]+=1
for i in range(5):
ans+=④__a[i][c[i]]__或其他等价答案__
print(”方案总时耗: ”,ans)
print(”各选手需包粽子数目: ”,c[0],c[1],c[2],c[3],c[4])
【解析】 ①高二年级组5名选手的包粽子成绩保存在文件“data.txt”中,打开“data.txt”。②列表a的存储结构为a=[[0,66,140,240,342,448],[1,60,121,192,274,360],…],每个小列表中,a[0][0]代表第1名选手的编号,之后的元素表示包累计粽子数的时间。此处是求解包单个粽子的时间,并存入列表b,由于循环从2开始,则需要减去前一个累计时间,故答案为:a[i][j]-a[i][j-1]。③列表c初始存储每名选手包1个粽子,程序执行后存储包粽子的数量,若条件“b[j][c[j]+1]<minx and c[j]+1<=5”成立,则用pos记下编号,minx记下目前最少时间,答案为minx=b[j][c[j]+1]。④最后一个循环,将每名选手的时间累加,列表c记下了每名选手包粽子的数量,则在列表中找到每名选手的总时间,答案为:a[i][c[i]]。
学科网(北京)股份有限公司
$$