完成以下程式的設計:某體操比賽共有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)
運行結果截圖

總結
這幾個功能模塊中的代碼注釋很詳細,有啥問題,可以在評論區留言,我看到后會及時回復,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/236088.html
標籤:python
