Преобразование чисел в классы в списке 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). Есть ли способ, когда я могу использовать фильтр и лямбда и получить требуемый результат в одной строке? Ожидание вывода в виде меток с оценкой. (например: 50 - A, 62 - A, 76 - A ++...)
Ответы
Ответ 1
Определите функцию, которая принимает метку и возвращает читаемое человеком представление, вы можете использовать выражение larsmans или следующее:
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
Ответ 2
Забудьте 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
, чтобы получить оценки и оценки в одном списке.
Ответ 3
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')]
Ответ 4
Вы можете написать свою собственную функцию, подобную фильтру:
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)