Преобразование чисел в оценки в списке Python - PullRequest
19 голосов
/ 15 марта 2012

У меня есть список, в котором указано количество оценок учащихся.

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).Есть ли способ, где я могу использовать фильтр и лямбда и получить требуемый результат в одной строке?Ожидая вывод в виде отметок с оценкой.(напр .: 50 - А, 62 - А, 76 - А ++ ...)

Ответы [ 4 ]

21 голосов
/ 15 марта 2012

Определите функцию, которая принимает метку и возвращает читаемое человеком представление. Вы можете использовать выражение larsmans или это:

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

Использовать string.format для форматирования каждой записи иmap для перебора всех из них:

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
15 голосов
/ 15 марта 2012

Забудь lambda, забудь filter;следующее делает оценку в одном выражении, предполагая, что есть оценка B между A и "fail".

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

Вы можете zip результат этого с s, чтобы получить оценки и оценки в одномсписок.

2 голосов
/ 01 сентября 2012
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')]
1 голос
/ 15 марта 2012

Вы можете написать свою собственную фильтр-функцию:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...