Python练习题NP47牛牛的绩点

描述

牛牛在门头沟大学学习,一学年过去了,需要根据他的成绩计算他的平均绩点,假如绩点与等级的对应关系如下表所示。请根据输入的等级和学分数,计算牛牛的均绩(每门课学分乘上单门课绩点,求和后对学分求均值)。

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))两边的括号也是必不可少的,不然会有优先级问题。