模拟决赛现场最终成绩计算过程
键盘输入:k,n (n>2k), 若不合法,重新输入。
- 首先输入大于3的整数n作为评委人数,输入每个选手的姓名,然后依次输入每个评委的打分,要求每个分数都介于0~100。
- 输入完所有的评委打分后,去掉一个k最高分,去掉一个k最低分,剩余分数的评价分即为该选手的最终得分。
- 最后打印输出各选手的得分情况,并以逆序输出。
- 本程序的核心在于使用try-except做输入数据的检验,只有当输入的数据满足条件才会退出
while True
循环,当数据不符合规范时便会raise一个异常,让用户再次输入,直至输入正确 - 在判断输入的分数是否介于0~100时,使用了
[x >= 0 and x <= 100 for x in scorelist]
列表解析式得到各元素是否符合的布尔列表,再通过all()判断是都全符合:如果元祖或列表中所有元素不为0、空(’’)、False 即所有元素满足0<=x<=100返回True,否则返回False。 - 将选手名作为键,最终得分作为值放入字典中,再通过字典解析式进行以值为准的逆序排序。
while True:
try:
# 先输入 k表示选手个数
k = int(input('请输入选手个数'))
if k < 1:
raise ValueError("选手个数非法")
# 再输入 n表示评委人数
n = int(input('请输入评委人数'))
if n <= 3:
raise ValueError("评委人数未超过3人")
# 判断是否满足条件
if n <= 2 * k:
raise ValueError("n>2k不成立")
break
except ValueError as ve:
print(f"数据错误,请重新输入{ve}")
sum = [] # 选手得分情况,排序前的结果初始化
player_dict = {}
for i in range(k):
# 异常处理,检测输入的数据是否合法
while True:
try:
s = input(f'请输入第{i+1}名选手的姓名和个评委的打分,中间使用空格分开\n').split(' ') # 输入选手信息
# 获取选手姓名,以及转为int类型的分数列表
name = s[0]
scorelist = list(map(int, s[1:]))
# 输入的分数数量与评委数量相等
if len(scorelist) != n:
raise ValueError("评委分数个数错误")
# all():如果元祖或列表中所有元素不为0、空(’’)、False 即所有元素满足0<=x<=100返回True,否则返回False;
elif not all([x >= 0 and x <= 100 for x in scorelist]):
raise ValueError("打分错误,分数介于0~100")
else:
break
except ValueError as ve:
print(f"数据错误:{ve}")
# 分数排序并去掉一个k最高分,去掉一个k最低分
scorelist.sort()
scorelist = scorelist[1:-1]
#计算平均分
sumscore = 0
for h in range(len(scorelist)): # 求总得分
sumscore += scorelist[h]
# 求平均分,保留两位小数 2
average = round(sumscore / len(scorelist), 2)
player_dict[name] = average
# 将 选手:平均分 字典按照值逆序排列
player_dict = dict(sorted(player_dict.items(), key=lambda item: item[1], reverse=True))
# 输出分数
print(f"各选手的得分情况:{player_dict}")
运行结果