Python中的字典帮助

时间:2012-11-06 19:06:00

标签: python dictionary

假设某人正在制作成绩系统,并且他们有一本字典,其中每个成绩字母为值,百分比为关键字。你怎么能选择一个值,如果你把你的密钥设为75%并且你希望它打印“C”,但如果输入74%或79%,它仍会打印“C”。

5 个答案:

答案 0 :(得分: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]`.

如果您不喜欢所有打字,可以将您的词典初始化为:

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]

答案 1 :(得分:4)

Livingston博士,我推测。

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

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

好的,所以这不是一个实际的例子。但是,我希望你能适应这一点,这对你有用。

答案 2 :(得分:1)

我会使用numpy并定义bin。分类数据是一个常见问题。

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

答案 3 :(得分: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)

答案 4 :(得分: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)

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