2017-04-27 7 views
0

リストを受け入れる独自の関数を記述する必要があります。リストに指定された文字が含まれている場合、その文字は削除されます。ここに私が持っているものがあります。文字をリストから削除する関数を記述しますか?

def deleteElement(self,x): 
    length = len(self.elements) 
    print length 
    for i in range(length): 
     if (self.elements[i] == x): 
      del self.elements[i] 

しかし、これはインデックスの範囲外のエラーを生成し続けますが、なぜこのようなことが起こっているのかわかりません。

+0

おそらくあなたのリストので、重複があるため、要素を正常に削除するたびにインデックスを1ずつ変更する必要があります。それについて考える。 –

+0

'length = len(self.elements)'は常に境界外のインデックスを与えます。 '' 1,2 ''のようなリストは '2'の 'len'を持ちますが、インデックスは2 – Cfreak

+0

@Cfreakではありません。なぜなら、' 0(長さ) 'から ' 1 ' –

答えて

0

あなたが削除された項目数を追跡すること、それに応じてインデックスを調整するように注意している場合は、この操作を行うことができます。

In [91]: def deleteElement(elements,x): 
    ...:  offset = 0 
    ...:  length = len(elements) 
    ...:  for i in range(length): 
    ...:   if elements[i - offset] == x: 
    ...:    del elements[i - offset] 
    ...:    offset += 1 
    ...: 

In [92]: elements = [1, 2, 3, 1, 2, 3, 1, 2, 3] 

In [93]: deleteElement(elements, 1) 

In [94]: elements 
Out[94]: [2, 3, 2, 3, 2, 3] 
0
#Can I suggest a different method? 
def deleteElement(self,x): 
    self.elements = [e for e in self.elements if e!=x] 
0

ゴールデンルールでは、ループしている間はリストを変更しないでください。必ずしも場合は、コピーを使用することがあります。

def deleteElement(self,x): 
    length = len(self.elements) 
    temp = self.elements[:] 
    print length 
    for i in range(length): 
     if (self.elements[i] == x): 
      del temp[i] 
    self.elements = temp[:] 
関連する問題