2012-03-15 6 views
19

私には、学生が持っている刻み数のリストがあります。数字をpythonリストの等級に変換する

s = [50,62,15,76,57,97,82,99,45,23] 

私はマークに従っ年生にしたい:

<40 - Fail 
>50 - A Grade 
>75 - A++ Grade 

私は反復ループでこれを行うことができますか私は、ラムダを使用して、すべてのリストを見つけることができます。例えば :

>>> filter(lambda x:x>=50, s) 
[50, 62, 76, 57, 97, 82, 99] 

しかし、フィルタに、私は一度に一つの機能で動作することができる(例:50よりも大きいマーク)。フィルタとラムダを使用して1行に必要な結果を得る方法はありますか?グレードのマークとしてアウトプットを期待する。 (例:50-A、62-A、76-A ++ ...)

答えて

21

がマークをとり、人間が読める表現を返す関数を定義し、に

def grade(i): 
    if i<40: return "Fail" 
    if i>75: return "A++" 
    if i>50: return "A" 

使用String.Formatの:あなたはlarsmans's expressionまたはこのいずれかを使用することができますフォーマット各エントリおよびそれらのすべてを反復処理するためにマップ:

li = map(lambda x: "{0} - {1}".format(x, grade(x)), s) 

結果のリストが今必要な形式の文字列が含まれています。 '、(X:

for i in li: print i 

# output 

50 - None 
62 - A 
15 - Fail 
76 - A++ 
57 - A 
97 - A++ 
82 - A++ 
99 - A++ 
45 - None 
23 - Fail 
+0

{0}と{1 }うまくいく? – Josh

+0

@Josh http://docs.python.org/2/library/stdtypes.html#str.format – Anentropic

15

忘れてlambda、忘れてfilter; Aと "失敗"の間にB級があると仮定して、次の式を1つの式で格付けします。

["fail" if g < 40 else "B" if g < 60 else "A" if g < 75 else "A++" for g in s] 

あなたは zip sと、この結果は、1つのリストにマークと成績を取得することができます。答えは今、次のように見ている

def filter_n(n, f, lst): 
    result = tuple([[] for i in range(n)]) 
    for elem in lst: 
     result[f(elem)].append(elem) 
    return result 

+0

である例えば、フィルタを行うのか、あなたはマップ、 'マップ(ラムダXを使用することができますx> 40ならばF '、それ以外なら' A ++ '、それ以外なら' A ')、s) 'あるいは、ちょうどグレードが必要な場合は '(x、'(と ')'を)失うだけです。リストは、後でそれにマッチするように順序付けられています。 – rplnt

+0

あなたの理解度は78文字です。あなたは自由な改行を受け取ります。私はそれがGoogle Pythonスタイルのルールに反していることは知っていますが、複数の行に分割することをお勧めします。おそらくそれぞれのelseの終わりです。 – Droogans

+0

@Droogans:私はGoogleのスタイルルールは認識していませんが、実用的なプログラムでは、改行を実際に入れています。http://stackoverflow.com/a/5809080/166749 –

1

独自のフィルターのような関数を書くことができます

grades = filter_n(3, lambda x: (x < 40) * 0 + 
           (60 < x <= 75) * 1 + 
           (75 < x) * 2, s) 
2
s = [50,62,15,76,57,97,82,99,45,23] 
x = dict([(a, 'A++' if a>75 else 'A' if a>55 else 'F') for a in s]) 

print x 

{97: 'A++', 45: 'F', 99: 'A++', 76: 'A++', 82: 'A++', 15: 'F', 50: 'F', 23: 'F', 57: 'A', 62: 'A'} 

使用x.items()

filter(lambda x: x[1] == 'A', x.items()) 

結果が

[(57, 'A'), (62, 'A')] 
+0

2つのスコープが1行で表示され、「x」の名前は異なるものです。他の答えとあまり変わらないので、あなたが編集権限を持っていれば、編集は答えよりもよいかもしれません。 –

関連する問題