Python 3 возвращает итератор из filter, поэтому должен быть заключен в вызов list()
str_list = list(filter(None, str_list))
Ответ 2
Использование понимания списка является наиболее питонистским способом:
>>> strings = ["first", "", "second"] >>> [x for x in strings if x] ['first', 'second']
Если список необходимо изменить на месте, потому что есть другие ссылки, которые должны видеть обновленные данные, тогда используйте назначение фрагмента:
strings[:] = [x for x in strings if x]
Ответ 3
у filter на самом деле есть специальная опция для этого:
filter(None, sequence)
Он отфильтрует все элементы, которые принимают значение False . Здесь нет необходимости использовать фактический вызываемый объект, такой как bool, len и так далее.
Обратите внимание, что filter(None, lstr) не удаляет пустые строки с пробелом ' ', он только сокращает, '' в то время как ' '.join(lstr).split() удаляет оба.
Для использования filter() с удаленными строками пробелов требуется намного больше времени:
>>> timeit('filter(None, [l.replace(" ", "") for l in lstr])', "lstr=['hello', '', ' ', 'world', ' ']", number=10000000) 18.101892948150635