Удаление элемента из списка, соответствующего подстроке - Python

Как удалить элемент из списка, если он соответствует подстроке?

Я попытался удалить элемент из списка с помощью методов pop() и enumerate, но похоже, что мне не хватает нескольких смежных элементов, которые необходимо удалить:

sents = ['@$\tthis sentences needs to be removed', 'this doesnt',
     '@$\tthis sentences also needs to be removed', 
     '@$\tthis sentences must be removed', 'this shouldnt',
     '# this needs to be removed', 'this isnt',
     '# this must', 'this musnt']

for i, j in enumerate(sents):
  if j[0:3] == "@$\t":
    sents.pop(i)
    continue
  if j[0] == "#":
    sents.pop(i)

for i in sents:
  print i

Вывод:

this doesnt
@$  this sentences must be removed
this shouldnt
this isnt
#this should
this musnt

Требуемый вывод:

this doesnt
this shouldnt
this isnt
this musnt

Ответ 1

Как насчет чего-то простого:

>>> [x for x in sents if not x.startswith('@$\t') and not x.startswith('#')]
['this doesnt', 'this shouldnt', 'this isnt', 'this musnt']

Ответ 2

Другой метод с использованием filter

filter( lambda s: not (s[0:3]=="@$\t" or s[0]=="#"), sents)

Проблема с вашим orignal-подходом заключается в том, что вы находитесь в элементе списка i и определяете, что его нужно удалить, вы удалите его из списка, который перемещает элемент i+1 в позицию i. Следующая итерация цикла в индексе i+1, но элемент на самом деле i+2.

Имеют смысл?

Ответ 3

Это должно работать:

[i for i in sents if not ('@$\t' in i or '#' in i)]

Если вы хотите только те вещи, которые начинаются с указанных указанных значений, используйте метод str.startswith(stringOfInterest)