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

あなたの提案の問題は、浮動小数点数をキーとして使用することになる可能性が高く、浮動小数点演算の欠点により、それらを辞書のキーとして使用するのが非常に難しいことです。これは float を整数にマップし、それらの整数をディクショナリのキーとして使用します。これは非常にクリーンです。


必要に応じて、もう少し賢くなることもできます。

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

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 に答える
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 に答える
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 に答える