Вопрос-Ответ

Remove empty strings from a list of strings

Удалить пустые строки из списка строк

Я хочу удалить все пустые строки из списка строк в python.

Моя идея выглядит следующим образом:

while '' in str_list:
str_list.remove('')

Есть ли еще какой-нибудь питонический способ сделать это?

Переведено автоматически
Ответ 1

Я бы использовал filter:

str_list = filter(None, str_list)
str_list = filter(bool, str_list)
str_list = filter(len, str_list)
str_list = filter(lambda item: item, str_list)

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 и так далее.

Это так же быстро, как map (bool, ...)

Ответ 4
>>> lstr = ['hello', '', ' ', 'world', ' ']
>>> lstr
['hello', '', ' ', 'world', ' ']

>>> ' '.join(lstr).split()
['hello', 'world']

>>> filter(None, lstr)
['hello', ' ', 'world', ' ']

Сравнить время

>>> from timeit import timeit
>>> timeit('" ".join(lstr).split()', "lstr=['hello', '', ' ', 'world', ' ']", number=10000000)
4.226747989654541
>>> timeit('filter(None, lstr)', "lstr=['hello', '', ' ', 'world', ' ']", number=10000000)
3.0278358459472656

Обратите внимание, что filter(None, lstr) не удаляет пустые строки с пробелом ' ', он только сокращает, '' в то время как ' '.join(lstr).split() удаляет оба.

Для использования filter() с удаленными строками пробелов требуется намного больше времени:

>>> timeit('filter(None, [l.replace(" ", "") for l in lstr])', "lstr=['hello', '', ' ', 'world', ' ']", number=10000000)
18.101892948150635
python string list