将数字转换为python列表中的等级

sam*_*sam 19 python lambda list filter

我有一个列表,其中包含学生的分数.

s = [50,62,15,76,57,97,82,99,45,23]
Run Code Online (Sandbox Code Playgroud)

我想根据分数对学生进行评分:

<40 - Fail
>50 - A Grade
>75 - A++ Grade
Run Code Online (Sandbox Code Playgroud)

我可以通过迭代循环来做到这一点,或者我可以使用lambda找到每个列表.例如 :

>>> filter(lambda x:x>=50, s)
[50, 62, 76, 57, 97, 82, 99]
Run Code Online (Sandbox Code Playgroud)

但是,在过滤器中,我一次只能处理一个函数(例如:标记大于50).有没有办法我可以使用filter和lambda并在一行中获得所需的结果?期望输出为等级标记.(例如:50 - A,62 - A,76 - A ++ ......)

Miz*_*zor 21

定义一个带标记并返回人类可读表示的函数,你可以使用larsmans的表达式或者这个:

def grade(i):
    if i<40: return "Fail"
    if i>75: return "A++"
    if i>50: return "A"
Run Code Online (Sandbox Code Playgroud)

使用string.format格式化每个条目并映射以迭代所有条目:

li = map(lambda x: "{0} - {1}".format(x, grade(x)), s)
Run Code Online (Sandbox Code Playgroud)

结果列表现在包含所需格式的字符串.

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
Run Code Online (Sandbox Code Playgroud)


Fre*_*Foo 15

忘记lambda,忘记filter; 以下是一个表达式中的分级,假设A和"失败"之间存在B等级.

["fail" if g < 40 else "B" if g < 60 else "A" if g < 75 else "A++" for g in s]
Run Code Online (Sandbox Code Playgroud)

您可以使用zip此结果s在一个列表中获取标记和成绩.