Нужно вывести из списка количество чисел кратных 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 шт):
после split вы получаете список, в котором каждый элемент строка. Следует применить функцию map
len(list(filter(lambda x: x % 3 == 0,map(int, a))))
Можете прямо внутри lambda преобразовать в int. Ну и в целом можно короче записать, без лишних преобразований, пользуясь тем, что при арифметических действиях True считается как 1, а False как 0:
a = input('Введите числа: ').split()
print(sum(map(lambda x: int(x) % 3 == 0, a)))
Не надо спешить и затруднять себе жизнь.
Медленно, шаг за шагом:
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))))
По моему страшное сделать все в одной строке программы, я лично не вижу в том никакой красоты.