Python | Фильтрация списка
Нужно создать функцию, которая берёт список неотрицательных целых чисел и строк и возвращает новый список с отфильтрованными строками | CodeWars
Пример: filter_list([1,2,'a','b']) == [1,2]
Я написал следующий код, но он проходит не все тесты (в закрепе 3-ий выдаёт ошибку).
def filter_list(l):
new_l = []
for i in range (len(l)):
try:
int(l[i])
new_l.append(l[i])
except ValueError:
continue
return new_l
Тесты:
import codewars_test as test
from solution import filter_list
@test.describe('Sample tests')
def sample_tests():
@test.it('should work for basic examples')
def basic_examples():
test.assert_equals(filter_list([1, 2, 'a', 'b']), [1, 2], 'For input [1, 2, "a", "b"]')
test.assert_equals(filter_list([1, 'a', 'b', 0, 15]), [1, 0, 15], 'Fot input [1, "a", "b", 0, 15]')
test.assert_equals(filter_list([1, 2, 'aasf', '1', '123', 123]), [1, 2, 123], 'For input [1, 2, "aasf", "1", "123", 123]')
Ответы (2 шт):
Судя по третьему тесту строки вида '123' считаются строками и должны пропускаться, а у вас они успешно преобразуются в int и добавляются.
Нужно проверять, что текущий элемент уже имеет тип int, это делается примерно так:
if isinstance(l[I], int):
Решение через генератор списка(где в список будут добавляться значения, удовлетворявшие условию isinstance(item, int)):
def filter_list(items):
return [item for item in items if isinstance(item, int)]
Так же советую вместо range (len(l)) использовать встроенную функцию enumerate, пример:
for i, item in enumerate(items):
pass
Где, i - индекс элемента, item - само значение.