如何从字典的值中获取键

How to get key from the value of dictionary

我有以下一套评分系统规则

if 25 < score <= 30, grade = A. 
if 20 < score <= 25, grade = B. 
if 15 < score <= 20, grade = C. 
if 10 < score <= 15, grade = D. 
if 5 < score <= 10, grade = E. 
if 0 <= score <= 5, grade = F. 

所以我必须编写一个将分数作为参数和 returns 字母等级的函数。所以我可以使用选择(如果,否则)来做到这一点。但我想以不同的方式来做。 例如我想声明一个如下的字典:

gradeDict = {
    'A': [26, 27, 28, 29, 30],
    'B': [21, 22, 23, 24, 25],
    'C': [16, 17, 18, 19, 20],
    'D': [11, 12, 13, 14, 15],
    'E': [6, 7, 8, 9, 10],
    'F': [0, 1, 2, 3, 4, 5] 
}

所以在用值检查分数时我想 return 键

在 python 中我学到了类似 dict.get(term, 'otherwise') 的东西,但它会给你价值。是否有任何其他机制做相反的事情,即:如果我们可以在 get 方法中传递值,它将 return 键?

有趣的是你甚至不需要字典,只需要一个数组。 Ofc 你可以通过声明以下字典以字典方式完成它:

gradeDict = {
        1:'F',
        2:'E',
        3:'D',
        4:'C',
        5:'B',
        6:'A'
    }

这个字典似乎没用,因为它只是索引 1,2,3 的有序列表... 你可以改造它:grates_arr = ['F', 'E', 'D', 'C', 'B', 'A']

但是我怎样才能得到我需要的信呢?你可能会问。很简单,将分数除以 5。21 // 5 表示 4。grates_arr[21//5] 是 'B'。 2个更多的特殊情况: 当分数除以 5 时意味着您必须减去 1,因为例如 25 // 5 意味着 5 但 grates_arr[5] 是 A 而不是 B。 分数为0时不减。

bisect 标准库为此类问题提供了一个优雅的解决方案。事实上,grading is one of the examples shown in the docs.。这是根据 OP 的评分曲线改编的示例:

示例:

from bisect import bisect_left

def grade(score, breakpoints=[5, 10, 15, 20, 25], grades='FEDCBA'):
    i = bisect_left(breakpoints, score)
    return grades[i]

[grade(score) for score in [1, 5, 8, 10, 11, 15, 17, 20, 22, 25, 26]]

输出:

['F', 'F', 'E', 'E', 'D', 'D', 'C', 'C', 'B', 'B', 'A']