【问题标题】:How to get key from the value of dictionary如何从字典的值中获取键
【发布时间】:2021-03-29 10:51:26
【问题描述】:

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

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 方法中传递值,它将返回键?

【问题讨论】:

    标签: python-3.x dictionary data-structures key-value


    【解决方案1】:

    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-else。因此,您提供的解决方案可以挽救。
    • 它工作正常,但如果你通过 50 作为分数,它将返回 A,这会破坏上面的评分系统条件。
    【解决方案2】:

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

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

    这个 dict 似乎没用,因为它只是索引 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 时不要减去。

    【讨论】:

    • 在您的方法中,所有字母等级 'FEDCBA'[score // 5] 的字符串也会这样做。但我想要那种字典方法。
    • letterGrade = 'FEDCBA'[(score - 1) // 5 if score > 0 else 0] 这和你的建议差不多。但是你能帮我解决我问这个问题的方式吗?
    • 好吧,如果你真的想使用那个似乎效率低下的字典,请看这里:stackoverflow.com/questions/8023306/…
    • mydict = {'george': 16, 'amber': 19} print(list(mydict.keys())[list(mydict.values()).index(16)]) 有看看它,这非常接近我想要的。但在我的情况下,值是一个列表。有什么方法可以在 index 中传递分数,然后遍历 dict 的值列表并最终返回键?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-02
    • 1970-01-01
    • 1970-01-01
    • 2019-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多