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

时间:2012-03-15 10:30:30

标签: python list filter lambda

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

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

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

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

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

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

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

4 个答案:

答案 0 :(得分:21)

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

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

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

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

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

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

答案 1 :(得分: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]

您可以zip使用s {{1}}将结果标记在一个列表中。

答案 2 :(得分: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')]

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

现在的答案如下:

grades = filter_n(3, lambda x: (x < 40) * 0 +
                               (60 < x <= 75) * 1 +
                               (75 < x) * 2, s)