Как удалить пустые места в списке?

#python #python-3.x #list

Вопрос:

У меня есть сообщение:

 text = '''
    Wales greatest moment. Lille is so close to the Belgian 
    border, 
    this was essentially a home game for one of the tournament favourites. Their 
    confident supporters mingled with their new Welsh fans on the streets, 
    buying into the carnival spirit - perhaps more relaxed than some might have 
    been before a quarter-final because they thought this was their time.
    In the driving rain, Wales produced the best performance in their history to 
    carry the nation into uncharted territory. Nobody could quite believe it.'''
 

У меня есть код:

  words = text.replace('.',' ').replace(',',' ').replace('n',' ').split(' ')
    print(words)
 

И Выход:

 ['Wales', 'greatest', 'moment', '', 'Lille', 'is', 'so', 'close', 'to', 'the', 'Belgian', 'border', '', '', 'this', 'was', 'essentially', 'a', 'home', 'game', 'for', 'one', 'of', 'the', 'tournament', 'favourites', '', 'Their', '', 'confident', 'supporters', 'mingled', 'with', 'their', 'new', 'Welsh', 'fans', 'on', 'the', 'streets', '', '', 'buying', 'into', 'the', 'carnival', 'spirit', '-', 'perhaps', 'more', 'relaxed', 'than', 'some', 'might', 'have', '', 'been', 'before', 'a', 'quarter-final', 'because', 'they', 'thought', 'this', 'was', 'their', 'time', '', 'In', 'the', 'driving', 'rain', '', 'Wales', 'produced', 'the', 'best', 'performance', 'in', 'their', 'history', 'to', '', 'carry', 'the', 'nation', 'into', 'uncharted', 'territory', '', 'Nobody', 'could', 'quite', 'believe', 'it', '']
 

Вы можете видеть, в списке есть пустые места, я удаляю 'n' , ',' и '.' .

Но теперь я понятия не имею, как удалить эти пробелы.

Комментарии:

1. Если вы не передаете аргумент split() , он использует произвольные последовательности пробелов в качестве разделителя, а не каждый отдельный ' ' символ.

2. Простое понимание может легко решить эту проблему: words = [_ for _ in text.replace('.',' ').replace(',',' ').split() if _.strip()] .

3. @accdias Что это значит [_ for _ in text.replace('.',' ').replace(',',' ').split() if _.strip()] ?

4. Означает «добавить _ в words , если _ не пусто».

5. Спасибо вам всем, ребята!

Ответ №1:

Вы можете отфильтровать их, если они вам не нравятся

 no_empties = list(filter(None, words))
 

Если функция есть None , то предполагается функция идентификации, то есть удаляются все элементы iterable, которые являются ложными.

Это работает, потому что пустые элементы считаются ложными.

Ответ №2:

Редактировать:

Исходный ответ не дает того же результата, что и в комментариях, из-за символа тире, чтобы избежать этого:

 import re
words = re.findall(r'[w-] ', text)
 

Оригинальный Ответ

Вы можете напрямую получить то, что хотите, с re помощью модуля

 import re
words = re.findall(r'w ', text)


['Wales',
 'greatest',
 'moment',
 'Lille',
 'is',
 'so',
 'close',
 'to',
 'the',
 'Belgian',
 'border',
 'this',
 'was',
 'essentially',
 'a',
 'home',
 'game',
 'for',
 'one',
 'of',
 'the',
 'tournament',
 'favourites',
 'Their',
 'confident',
 'supporters',
 'mingled',
 'with',
 'their',
 'new',
 'Welsh',
 'fans',
 'on',
 'the',
 'streets',
 'buying',
 'into',
 'the',
 'carnival',
 'spirit',
 'perhaps',
 'more',
 'relaxed',
 'than',
 'some',
 'might',
 'have',
 'been',
 'before',
 'a',
 'quarter',
 'final',
 'because',
 'they',
 'thought',
 'this',
 'was',
 'their',
 'time',
 'In',
 'the',
 'driving',
 'rain',
 'Wales',
 'produced',
 'the',
 'best',
 'performance',
 'in',
 'their',
 'history',
 'to',
 'carry',
 'the',
 'nation',
 'into',
 'uncharted',
 'territory',
 'Nobody',
 'could',
 'quite',
 'believe',
 'it']
 

Комментарии:

1. Это не приводит к одинаковым выходным данным.

2. Вы близки, но - это сбивает с толку

Ответ №3:

Причина, по которой у вас возникла эта проблема, заключается в том, что ваше текстовое значение имеет отступ в каждой строке с 4 пробелами, а не в том, что ваш код ошибочен. Вы можете добавить .replace(' ','') в свою логику «слов», чтобы исправить это, если вы хотите иметь по 4 одиночных пробела в каждой строке, или вы можете сослаться на решение Томаса Веллера, которое решит проблему независимо от того, сколько последовательных одиночных пробелов вы оставите

Комментарии:

1. @Mr. Robot Убедитесь, что первый параметр .replace содержит ровно четыре пробела