派森 #P131. 歌唱比赛统计

描述

某歌唱比赛有10位评委,选手得分规则为去掉一个最高分和最低分,取其余的平均分。选手们的成绩已经存放至sing.in文件(utf-8编码),请统计各位选手的得分,保留小数点后两位,并将成绩以降序排序输出至sing.out文件(utf-8编码)。 注意:测试用例中,选手数量可能与样例不同。

样例

输入:sing.in文件

小文,5.4,5.5,9.7,7.6,8.0,7.1,5.0,8.2,5.4,6.4
小强,7.6,9.2,8.0,7.8,8.7,8.2,9.0,5.2,9.1,7.4
小刘,9.4,6.9,9.7,8.5,6.2,9.3,6.5,9.4,9.3,5.9
小成,9.8,6.0,5.5,5.0,6.9,9.0,10.0,5.7,5.7,9.0
小罗,6.1,9.3,8.0,9.6,7.4,10.0,5.6,6.7,7.4,5.1

输出:sing.out文件

小强:8.22
小刘:8.19
小罗:7.51
小成:7.20
小文:6.70

代码:

fr = open('sing.in', 'r', encoding='utf-8')
fw = open('sing.out', 'w', encoding='utf-8')
scores = {}
for line in fr:
    items = line.strip().split(',')
    name = items[0]
    score = [float(x) for x in items[1:]]
    score.sort()
    score = score[1:-1]
    average = round(sum(score) / len(score), 2)
    average = '{:.2f}'.format(average)
    scores[name] = average
sorted_scores = sorted(scores.items(), key=lambda x: x[1], reverse=True)
for name, score in sorted_scores:
    fw.write(f'{name}:{score}\n')

代码解析:

  1. fr = open('sing.in', 'r', encoding='utf-8'):打开名为'sing.in'的文件,以只读模式读取('r'),使用UTF-8编码(encoding='utf-8'),并将文件对象赋值给变量fr
  2. fw = open('sing.out', 'w', encoding='utf-8'):打开名为'sing.out'的文件,以写入模式('w'),使用UTF-8编码(encoding='utf-8'),并将文件对象赋值给变量fw
  3. scores = {}:创建一个空字典scores,用于存储姓名和分数。
  4. for line in fr::遍历文件对象fr中的每一行数据,并将每一行赋值给变量line
  5. items = line.strip().split(','):使用字符串的strip()方法去除line两端的空白字符,使用split()方法按逗号","将每一行拆分成多个部分,并将拆分后的结果赋值给变量items,形成一个列表。
  6. name = items[0]:将列表items的第一个元素赋值给变量name,表示姓名。
  7. score = [float(x) for x in items[1:]]:通过列表推导式将列表items中从第二个元素到最后一个元素之间的每个元素转换为浮点数,并将转换后的结果组成一个新的列表,赋值给变量score,表示分数。
  8. score.sort():对列表score进行排序,从小到大。
  9. score = score[1:-1]:将列表score的第二个元素到倒数第二个元素之间的元素切片,并将切片后的结果重新赋值给变量score,表示去掉最低分和最高分后的分数列表。
  10. average = round(sum(score) / len(score), 2):计算去掉最低分和最高分后的分数列表的平均值,并将结果保留两位小数,赋值给变量average,表示平均分。
  11. average = '{:.2f}'.format(average):使用字符串的.format()方法将变量average格式化为保留两位小数的字符串形式,并将格式化后的结果重新赋值给变量average
  12. scores[name] = average:将姓名作为键,平均分作为对应键的值,将数据存入字典scores中。
  13. sorted_scores = sorted(scores.items(), key=lambda x: x[1], reverse=True):对字典scores中的项进行排序,按照值(平均分)进行排序,从高到低排列,并将排序后的结果赋值给变量sorted_scores
  14. for name, score in sorted_scores::遍历变量sorted_scores中的每一个元素,将每一个元素的键赋值给变量name,值赋值给变量score
  15. fw.write(f'{name}:{score}\n'):使用f-string将姓名和平均分以冒号":"分隔的形式写入文件fw,并在末尾添加换行符"\n"。

猜你喜欢

转载自blog.csdn.net/m0_63501513/article/details/132417577
今日推荐