Python 模拟决赛现场最终成绩计算过程 输入数据验证

模拟决赛现场最终成绩计算过程

键盘输入:k,n (n>2k), 若不合法,重新输入。

  1. 首先输入大于3的整数n作为评委人数,输入每个选手的姓名,然后依次输入每个评委的打分,要求每个分数都介于0~100。

  2. 输入完所有的评委打分后,去掉一个k最高分,去掉一个k最低分,剩余分数的评价分即为该选手的最终得分。

  3. 最后打印输出各选手的得分情况,并以逆序输出。

  • 本程序的核心在于使用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}")

运行结果

在这里插入图片描述

posted @ 2021-12-11 20:02  SKPrimin  阅读(1180)  评论(0编辑  收藏  举报