Eliminar un elemento de la lista que coincida con una subcadena

¿Cómo elimino un elemento de una lista si coincide con una subcadena?

He intentado eliminar un elemento de una lista utilizando el método pop() y enumerate , pero parece que me faltan algunos elementos contiguos que deben eliminarse:

 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 

Salida:

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

Salida deseada:

 this doesnt this shouldnt this isnt this musnt 

    ¿Qué tal algo simple como:

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

    Esto debería funcionar:

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

    Si solo quiere cosas que comiencen con las sentenciales especificadas, use el str.startswith(stringOfInterest)

    Otra técnica con filter

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

    El problema con su enfoque original es que cuando se encuentra en el ítem de la lista i y determina que debe eliminarse, lo elimina de la lista, lo que desliza el ítem i+1 en la posición i . La siguiente iteración del bucle está en el índice i+1 pero el elemento es en realidad i+2 .

    ¿Tener sentido?