Python期末作业
作者:互联网
完成以下程序的设计:某体操比赛共有10名运动员参加,12名评委将根据运动员表现进行评分(满分10分),请编写Python程序,解决下列问题:
1).每个运动员评分中去掉一个最高分和一个最低分,计算平均成绩,然后给出运动员排名;
2).尽量减少人为因素,组委会要求去掉第一个问题中打最高分或最低分次数排名前二的评委给每个运动员的评分,然后计算平均成绩后排名。
这里给出几个核心的功能模块
文件处理模块
def dispose_file(f):#处理数据文件函数
# 将文件存储在lis列表中
lis = []
for line in f:
# 使用map函数将每一行分数中的每个分数转化为float类型,然后在转化成list类型赋值给 l
l = list(map(float, line.split()))
lis.append(l)
return(lis)
打分模块
def mark(lis,n): #打分函数 lis参数是一个二维分数列表
#求平均分
arra = []
j = 1
if n==1:
#这个求的是没有去掉评委的每个运动员的平均分
for i in lis:
x = (sum(i) - max(i) - min(i)) / 10
# j:对应运动员的下标 x:平均分 将这个元组添加到(j,x)arra列表中
arra.append((j, x))
j += 1
else:
#这个求的是去掉了评委之后每个运动员的平均分
for i in lis:
x = sum(i)/10
arra.append((j, x))
j += 1
#这里使用了sort函数对arra列表的第二个元素进行排序
#key=lambda x:x[1] 利用了lambda表达式定义了一个匿名函数,x为参数,x[1]为返回值,返回arra中的第二个元素
#reverse = True表示降序 reverse = False 表示升序
arra.sort(key=lambda x:x[1],reverse = True)
for i in range(len(arra)):
print("第{0:3}名 {1:4}号运动员 平均分数为:{2:5.2f}".format(i+1,arra[i][0],arra[i][1]))
找出异常评委模块
def search_highest_OR_lowest(lis,n):#寻找最高次数或最低分次数前二的评委
# lis是一个二维分数列表 n=2表示去掉最高次数前二的评委 n=3表示去掉最低分数前二的评委
max_score_array=[] # 存最高分次数,列表里面每个元素时元组形式(a,b) a表示评委序号 b表示评委打最高分次数
min_score_array=[] # 存最低分次数,列表里面每个元素时元组形式(a,b) a表示评委序号 b表示评委打最高分次数
max_and_min_score_array=[] # 存每个评委打最高分次数和最低分次数只和,列表里面每个元素时元组形式(a,b) a表示评委序号 b表示评委打最高分次数和最低分次数只和
_max = [[0] * 2 for i in range(12)] #建立一个二维数组12行2列存每个评委打最高分次数
_min = [[0] * 2 for i in range(12)] #建立一个二维数组12行2列存每个评委打最低分次数
for i in range(12):
_max[i][0] = i #初始化打最高分评委序号:0-11
_min[i][0] = i #初始化打最低分评委序号:0-11
for i in range(10):
max_score = max(lis[i]) #找出第 i 个运动员的 最高分
min_score = min(lis[i]) #找出第 i 个运动员的 最低分
for j in range(12):
if(lis[i][j] == max_score):#找出给第 i 个运动员打最高分的那个评委
_max[j][1]+=1 #将次数+1
elif(lis[i][j] == min_score):#找出给第 i 个运动员打最底分的那个评委
_min[j][1]+=1 #将次数+1
for i in range(12):
#这里我将max_score_array列表中的每个元素定义成元组的形式,是为了之后调用sort函数对max_score_array列表进行排序
# min_score_array列表同理
max_score_array.append((i,_max[i][1])) # i 表示评委序号 _max[i][1]表示第i号评委打最高分的次数
min_score_array.append((i,_min[i][1])) # i 表示评委序号 _min[i][1]表示第i号评委打最低分的次数
max_and_min_score_array.append((i,_max[i][1]+_min[i][1])) # i 表示评委序号 _max[i][1]+_min[i][1]表示第i号评委打最低分的次数和最高分次数只和
#将最高分次数和最低分次数和两次次数之和降序排序
max_score_array.sort(key=lambda x:x[1],reverse=True)
min_score_array.sort(key=lambda x:x[1], reverse=True)
max_and_min_score_array.sort(key=lambda x:x[1],reverse=True)
if n==2:#n=4表示去掉两次次数之和前二的评委
take_out_judge_and_mark(lis,max_and_min_score_array,n)
elif n==3:
#输出每个评委打最高分的次数,并排序
for i in range(12):
print("第{0:3}名,{1:3}号评委打最高分次数{2:3}次".format(i+1,max_score_array[i][0]+1,max_score_array[i][1]))
elif n==4:
#输出每个评委打最低分的次数,并排序
for i in range(12):
print("第{0:3}名,{1:3}号评委打最低分次数{2:3}次".format(i+1,min_score_array[i][0]+1,min_score_array[i][1]))
elif n==5:
#输出最高分和最低分次数之和,并排序
for i in range(12):
print("第{0:3}名,{1:3}号评委打最高分和最低分之和次数{2:3}次".format(i + 1, max_and_min_score_array[i][0] + 1,max_and_min_score_array[i][1]))
去掉异常评委并打分模块
def take_out_judge_and_mark(lis,take_out,n):#去掉最高分或最低分次数前二的评委 和 打分 函数
#lis 表示全部运动员的分数 take_out 表示去掉大最高或最低分数前二的评委
m1 = take_out[0][0] #打最高分次数最多的评委的序号
m2 = take_out[1][0] #打最高分次数第二多的评委的序号
#输出异常的评委序号和打分次数
print("异常的前两位评委:")
if n == 2:
print("{0}号评委打分总次数为:{1}次".format(take_out[0][0]+1, take_out[0][1]))
print("{0}号评委打分总次数为:{1}次".format(take_out[1][0]+1, take_out[1][1]))
for i in range(10):
#去掉评委打的分数,这里我是评委的分数置0
lis[i][m1]=0
lis[i][m2]=0
#调用打分函数
mark(lis,n)
运行结果截图
总结
这几个功能模块中的代码注释很详细。有啥问题,可以在评论区留言,我看到后会及时回复。
标签:min,Python,max,作业,最高分,次数,score,期末,评委 来源: https://blog.csdn.net/qq_45675616/article/details/111298750