题目为给出一个纪录学生成绩的数量n,接着会给包含学生姓名与分数的资料,每个值都使用空格分隔。
最后一行query_name即要查询的学生的姓名,需要我们找到特定学生获得的分数的平均值,并且取到小数点后两位。
if __name__ == '__main__': n = int(input()) student_marks = {} for _ in range(n): name, *line = input().split() scores = list(map(float, line)) student_marks[name] = scores query_name = input() print()
首先第一步,仍然还是要先了解程式码再讲些什么,大致上解读后,除了* line以外,其他都还能认得,于是便先开始寻找* line的涵义。
主要用途为分解可叠代的(Iterable)物件元素,在进行建立或合併时非常的实用。
根据网路上查到的资料,得知假设以下述的程式码而言,line其实就等同于第一个资料以后,代表其他资料的一个运算子,如下方程式码
name, *line = input().split()#如果我input进去题目中的範例:Krishna 67 68 69#则Krishna则为name *line则是67 68 69#print一下就知道了print(name)print(*line)#得到的答案分别为#Krishna#67 68 69
于是便知道了,题目中的初始程式码中,意思是使用for in 将题目给予的答案,分别切割为name * line,
接着便要开始想如何print出特定学生获得的分数的平均值,并且取到小数点后两位。
由于我们已知sum()可以找列表的总和,而len()则是可以计算列表的个数
平均值即为round(sum(我们要找的那个学生的列表)/len(我们要找的那个学生的列表),2)
if __name__ == '__main__': n = int(input()) student_marks = {} for _ in range(n): name, *line = input().split() scores = list(map(float, line)) student_marks[name] = scores query_name = input() print(round(sum(student_marks[query_name])/len(scores)))
但当我输入进题目后,却是错的,因为我没有找到小数点后两位,但我不是已经round小数点后两位了吗?
我就开始搜寻python如何保留小数点后两位,最后得知原来round并不是取到小数俩后两位的方式
round採用的并不是四捨五入, 而是依照指定的位数, 往前或是往后取最接近的数
于是在找寻了许多资料后,去除掉需要引进模组(decimal)的方式,便剩下字符串格式化(%.2f)的方式
将字符串格式化代入到程式码运行后,便成功了这次的题目
if __name__ == '__main__': n = int(input()) student_marks = {} for _ in range(n): name, *line = input().split() scores = list(map(float, line)) student_marks[name] = scores #student_marks[krishna] = {67,68,69} query_name = input() score = sum(student_marks[query_name])/len(student_marks[query_name]) print("%.2f" % score)
参考资料:
保留小数点后两位的方式: https://blog.csdn.net/Jerry_1126/article/details/85009810
round的解释: https://dev.to/codemee/python-de-round-yu-decimal-mo-zu-269a
开箱运算子的解释: https://www.learncodewithmike.com/2019/12/python-unpacking.html