26

部分文字列と一致する要素をリストから削除するにはどうすればよいですか?

pop()andメソッドを使用してリストから要素を削除しようとしましたが、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
4

3 に答える 3

42

次のような単純なものはどうですか。

>>> [x for x in sents if not x.startswith('@$\t') and not x.startswith('#')]
['this doesnt', 'this shouldnt', 'this isnt', 'this musnt']
于 2012-10-01T02:34:46.783 に答える
16

これは機能するはずです:

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

指定されたセンテンスで始まるものだけが必要な場合は、str.startswith(stringOfInterest)メソッドを使用します

于 2012-10-01T02:37:13.817 に答える
14

を使用する別の手法filter

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

元のアプローチの問題は、リストアイテムを表示iしていて、それを削除する必要があると判断した場合に、リストからアイテムを削除して、i+1アイテムをそのi位置にスライドさせることです。ループの次の反復はインデックスにありますi+1が、アイテムは実際にはi+2です。

わかる?

于 2012-10-01T02:45:16.943 に答える