描述
牛牛在门头沟大学学习,一学年过去了,需要根据他的成绩计算他的平均绩点,假如绩点与等级的对应关系如下表所示。请根据输入的等级和学分数,计算牛牛的均绩(每门课学分乘上单门课绩点,求和后对学分求均值)。
A
4.0
B
3.0
C
2.0
D
1.0
F
0
这一题来自牛客网,题目链接:here
输入描述:
连续输入一行等级一行学分,遇到等级为False则结束输入。
输出描述:
均绩保留两位小数。
示例1
输入:
A
3
B
4
C
2
False
输出:
3.11
我的解答
最初的解答:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| d={'A':4.0,'B':3.0,'C':2.0,'D':1.0,'F':0}
b=[]
c=[]
i=1
while True:
a = input()
if a != "False" and i%2 == 1:
b.append(a)
i += 1
elif a != "False" and i%2 == 0:
c.append(int(a))
i += 1
elif a == "False":
break
else:
break
e=0
for i,j in zip(b,c):
e += d[i]*j
print("%.2f" % (e/sum(c)))
|
很不优雅。我看到高赞解答后,真的是惊为天人,太优雅了!
我又动手写了一个优雅版的:
1
2
3
4
5
6
7
8
9
| d={'A':4.0,'B':3.0,'C':2.0,'D':1.0,'F':0}
t1 = 0
t2 = 0
while (rank:=d.get(input(),False)) is not False:
score = int(input())
t1 += rank * score
t2 += score
print("%.2f" % (t1/t2))
|
用到了海象运算服,用到了字典的get()
方法,关键是它还很短。
is not False
是必不可少的(或者可以用其他办法)。因为,如果输入的是“F”,那么rank
的值就是0
,在条件判断中就相当于False
,while循环就没办法继续了。所以就只好想办法不让Python把0
当成False
。
在(rank:=d.get(input(),False))
两边的括号也是必不可少的,不然会有优先级问题。