如何从字典的值中获取键

问题描述

我有以下评分系统规则

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. 

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

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] 
}

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

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

解决方法

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,11,17,22,25,26]]

输出:

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

,

有趣的是,你甚至不需要字典,只需要一个数组。 Ofc 您可以通过声明以下 dict 以字典方式进行操作:

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

这个 dict 似乎没用,因为它只是索引 1,2,3 的有序列表...... 您可以对其进行转换:grates_arr = ['F','A']

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