web-dev-qa-db-fra.com

Suppression d'un élément de la liste correspondant à une sous-chaîne

Comment supprimer un élément d'une liste s'il correspond à une sous-chaîne?

J'ai essayé de supprimer un élément d'une liste à l'aide des méthodes pop() et enumerate mais il semble que je manque quelques éléments contigus qui doivent être supprimés:

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

Production:

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

Sortie désirée:

this doesnt
this shouldnt
this isnt
this musnt
20
alvas

Que diriez-vous de quelque chose de simple comme:

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

Cela devrait fonctionner:

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

Si vous ne voulez que des choses qui commencent par les sententielles spécifiées, utilisez la méthode str.startswith(stringOfInterest)

13
mjgpy3

Une autre technique utilisant filter

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

Le problème avec votre approche d'origine est lorsque vous êtes sur l'élément de liste i et déterminez qu'il doit être supprimé, vous le supprimez de la liste, ce qui fait glisser le i+1 élément dans la position i. La prochaine itération de la boucle, vous êtes à l'index i+1 mais l'élément est en fait i+2.

Ça a du sens?

12
cod3monk3y