0

假设有人正在制作一个等级系统,他们有一本字典,其中每个等级字母作为值,百分比作为键。如果说,您的密钥为 75%,并且您希望它打印“C”,那么您将如何选择一个值,但是如果您输入 74% 或 79%,它仍然会打印“C”。

4

5 回答 5

4

我会使用类似的东西:

d = {10:'A', 9:'A', 8:'B', 7:'C', 6:'D', 5:'F', 4:'F', 3:'F', 2:'F', 1:'F', 0:'F'}
print d[int(95.0/10)]  #same as `d[95//10]`.

如果你不喜欢所有的输入,你可以将你的 dict 初始化为:

d = dict(zip(range(10,-1,-1),'AABCDFFFFFF'))

您的建议的问题是您最终可能会使用浮点数作为键,并且由于浮点运算的缺点,很难将它们用作字典键。这会将浮点数映射到整数,然后将这些整数用作字典中的键,这样更简洁。


如果你愿意,你甚至可以更聪明一点:

class GradeBook(dict):
    def __getitem__(self,key):
        return dict.__getitem__(self,key//10)

    def __missing__(self,key):
        if key > 9:
            return 'A'
        elif key < 5:
            return 'F'

d = GradeBook(zip(range(5,10),'FDCBA'))
print d[100]
print d[45]
print d[120]
print d[45.2]
print d[72.8]
于 2012-11-06T19:08:25.843 回答
4

利文斯顿医生,我猜。

不,但实际上,这不是字典的工作方式。字典将值映射到键。您正在寻找的是一个将值转换为字母的函数。

def grade_value(grade):
    if grade == 100:
        return "A is for Awesome!"
    if grade > 50:
        return "F is for FAILURE!!!"

好的,所以这不是一个实际的例子。但是,我希望你能适应它,让它适合你。

于 2012-11-06T19:09:48.337 回答
1

我会使用 numpy 并定义垃圾箱。数据分箱是一个常见问题。

import numpy as NP                                                              
grades = NP.random.randint(0, 100, 30)                                          

bins = NP.array([0., 20., 40., 60., 80., 100.])                                 

# d is an index array holding the bin id for each point in A                    
d = NP.digitize(grades, bins)                                                   
cat = ['A','B','C','D','E']                                                     
g = [cat[i-1] for i in d]                                                       

print grades,'\n'                                                               
print bins,'\n'                                                                 
print g,'\n'                                                                    

'''                                                                             
output                                                                          

[80 75 65  2 41 79 49 64 68 18 88  0 60 90 79 96 42  0 43  8  7 36 96 22 96     
 18 17 80 54 34]                                                                

[   0.   20.   40.   60.   80.  100.]                                           

['E', 'D', 'D', 'A', 'C', 'D', 'C', 'D', 'D', 'A', 'E', 'A', 'D', 'E', 'D', 'E'\
, 'C', 'A', 'C', 'A', 'A', 'B', 'E', 'B', 'E', 'A', 'A', 'E', 'C', 'B']         
'''                                                                             
于 2012-11-06T19:22:37.917 回答
1

我建议使用包含grade, score-pairs 的元组列表,因为这将允许您自由指定百分比分数如何映射到成绩:

grades = [
    ('A', 90),
    ('B', 80),
    ('C', 70),
    ('D', 60),
    ('F', None)
]

def get_grade(score):
    return [grade for grade, grade_score in grades if score>=grade_score][0]

用法:

print get_grade(45)
于 2012-11-06T19:34:03.160 回答
0
grades = {60: 'F', 70: 'D', 80: 'C', 90: 'B', 100: 'A'}


def get_grade(percent):
    for k in sorted(grades):
        if k >= percent:
            return grades[k]


if __name__ == '__main__':
    print get_grade(50)
    print get_grade(60)
    print get_grade(71)
    print get_grade(97)

在这种情况下,等级将对应于大于或等于百分比的最低键。

于 2012-11-06T19:11:22.783 回答