Удалить строки, содержащие только пробелы из списка
Как удалить пустые строки из списка? Я пробовал вот так:
starring = ['Vashu Bhagnani', 'Khemchand Bhagnani', ' ', 'Jacky Bhagnani', ' ', 'Prashant Shah', ' ']
output = filter(bool, starring)
Выход я хочу:
['Vashu Bhagnani', 'Khemchand Bhagnani', 'Jacky Bhagnani', 'Prashant Shah']
Но output
заканчивается тем же, что и input
. Какую правильную функцию передать на filter
?
Ответы
Ответ 1
Только пустая строка оценивается как False
, поэтому вам нужно использовать strip()
для удаления любых пробелов, и мы можем тогда полагаться на непустые строки, которые оцениваются как истинные.
>>> starring = ['Vashu Bhagnani', 'Khemchand Bhagnani', ' ', 'Jacky Bhagnani', ' ', 'Prashant Shah', ' ']
>>> starring = filter(lambda name: name.strip(), starring)
>>> starring
['Vashu Bhagnani', 'Khemchand Bhagnani', 'Jacky Bhagnani', 'Prashant Shah']
Хотя понимание списка может быть проще:
>>> [name for name in starring if name.strip()]
['Vashu Bhagnani', 'Khemchand Bhagnani', 'Jacky Bhagnani', 'Prashant Shah']
Ответ 2
Вы можете удалить конечные и ведущие пробелы, что приведет к пустой строке, если она содержит только те.
Учет списка:
l = [x for x in l if x.strip()]
С filter
и operator.methodcaller
[docs]:
l = filter(operator.methodcaller('strip'), l)
или проще:
l = filter(str.strip, l)
operator.methodcaller
будет единственным способом, если вы хотите передать дополнительные аргументы методу.
Ответ 3
s = ['Vashu Bhagnani', 'Khemchand Bhagnani', '', 'Jacky Bhagnani', '', 'Prashant Shah', '']
[a for a in s if len(a) > 0]