如何从字典的值中获取键
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']
我有以下一套评分系统规则
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']