Почему функция filter фильтрует 0 вместе с заданными по условию?
a1 = [-10, 27, 1000, -1, 0, -30]
list(filter(lambda x: x if x >= 0 else False,a1))
Данный код фильтрует 0 вместе с отрицательными числами. Почему так?
Ответы (2 шт):
filter(func, iterable) - фильтрует элементы iterable, проверяя условие bool(func(item)) == True. Когда элементом является 0 - вы вместо того чтобы вернуть True / False, возвращаете сам элемент, т.е. 0.
In [157]: bool(0)
Out[157]: False
Note that
filter(function, iterable)is equivalent to the generator expression(item for item in iterable if function(item))if function is notNoneand(item for item in iterable if item)if function isNone.
Сделайте так - выглядит понятнее и работать будет правильно:
In [156]: list(filter(lambda x: x >= 0, a1))
Out[156]: [27, 1000, 0]
Фильтруется потому что ты вместо истинного значения возвращаешь сам элемент, а 0 ложен. Надо возвращать значение самого условия, а не городить условный оператор. Но можно вообще записать красивее сразу через список с выражением.
a = [-10, 27, 1000, -1, 0, -30]
b = list(filter(lambda x: x >= 0, a))
c = [x for x in a if x >= 0]
print(b)
print(c)