部分文字列と一致する要素をリストから削除するにはどうすればよいですか?
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
次のような簡単な方法はどうでしょうか。
>>> [x for x in sents if not x.startswith('@$\t') and not x.startswith('#')]
['this doesnt', 'this shouldnt', 'this isnt', 'this musnt']
これはうまくいくはずです:
_[i for i in sents if not ('@$\t' in i or '#' in i)]
_
指定した文で始まるものだけが必要な場合は、str.startswith(stringOfInterest)
メソッドを使用します
filter
を使用する別のテクニック
_filter( lambda s: not (s[0:3]=="@$\t" or s[0]=="#"), sents)
_
オリジナルのアプローチの問題は、リストアイテムi
を使用していて、削除する必要があると判断した場合、リストから削除し、_i+1
_アイテムをi
の位置にスライドさせます。ループの次の反復はインデックス_i+1
_にありますが、アイテムは実際には_i+2
_です。
理にかなっていますか?