Нужно вывести из списка количество чисел кратных 3. Не понимаю, в чём ошибка. Python

a = str(input('Введите числа: ')).split()
print(len(list(filter(lambda x: x % 3 == 0, a))))

TypeError: not all arguments converted during string formatting

Почему вылазит такая ошибка? Вроде все правильно. Str перед input ни на что не влияет. И важно, делать не через цикл, а через максимально короткий код, что бы было как можно меньше строк


Ответы (3 шт):

Автор решения: ganz

после split вы получаете список, в котором каждый элемент строка. Следует применить функцию map

len(list(filter(lambda x: x % 3 == 0,map(int, a))))
→ Ссылка
Автор решения: CrazyElf

Можете прямо внутри lambda преобразовать в int. Ну и в целом можно короче записать, без лишних преобразований, пользуясь тем, что при арифметических действиях True считается как 1, а False как 0:

a = input('Введите числа: ').split()
print(sum(map(lambda x: int(x) % 3 == 0, a)))
→ Ссылка
Автор решения: MarianD

Не надо спешить и затруднять себе жизнь.
Медленно, шаг за шагом:

list_of_strings = input('Введите числа: ').split()            # список чисел в форме строк
iter_of_ints    = map(int, list_of_strings)                   # конверсия в итератор чисел
iter_of_3_mult  = filter(lambda x: x % 3 == 0, iter_of_ints)  # выбираем только кратные 3

for element in iter_of_3_mult:
    print(element)

Разве ли это не более красивое, чем например вторую и третью строку этого кода объединить в одну, заменяя в 3-й строке iter_of_ints его определением в 2-й строке?

iter_of_3_mult  = filter(lambda x: x % 3 == 0, map(int, list_of_strings))

Или затем даже выводить это, сначала конвертируя в список?

print(list(filter(lambda x: x % 3 == 0, map(int, list_of_strings))))

По моему страшное сделать все в одной строке программы, я лично не вижу в том никакой красоты.

→ Ссылка