2017-05-05 8 views
0

は私がリストを持って、リストから名前を削除し、私はオプションの名前を削除したいが、ラインPythonの - はIndexError - プログラムは

if newArray[i]==a: 

の下にそれが言う「はIndexError:範囲外のリストインデックスを」

newArray = ['John','Alex','Sophia','Rick'] 

a = str(raw_input('Type your name if you want to delete : ')) 
if a in newArray: 
    for i in range(len(newArray)): 
     if newArray[i]==a: 
      del newArray[i] # I want to delete it 
     else: 
      print newArray[i] 
+2

(http://stackoverflow.com/questions/1207406/remove-items-from-a-list-while-iterating)[繰り返しながらリストから項目を削除] – McGrady

+0

ループの可能性のある重複 '範囲内のi(len(newArray)-1、-1、-1)の場合 ' –

答えて

0

ループが進行すると、newArrayから項目を削除すると、forループの最後に到達できなくなります。 len(newArray)が3になった場合、4番目の要素を取得できないため、newArray[3]はエラーを発生させます。

これを行うにはもっとPythonの方法は、リストの理解を使用することがあります。

if a in newArray: 
    newArray = [i for i in newArray if i != a] 

(私はそれをプロファイルして見ることを約ないよが)それはしかし長いリストのための.index()方法よりも遅くなる可能性があります。

+0

これは原因を示していますが、修正を示していません。 –

+0

真実ですが、問題は問題を述べており、修正を求めることはありません。 – nimasmi

+0

私は修正を提案しました。 – nimasmi

0

同時にリストから要素を反復して削除しないでください。

が良く、このようにします:

>>> a = raw_input("enter name to delete: ") 
enter name to delete: Alex 
>>> a 
'Alex' 
>>> if a in newArray: 
...  del newArray[newArray.index(a)] 
... 
>>> newArray 
['John', 'Sophia', 'Rick'] 
+0

うん、ありがとう!私はそれをしました^^ – Neko

0

あなたは、このためのループのために必要はありません。

>>> newArray = ['John','Alex','Sophia','Rick'] 
>>> a = 'Alex' 
>>> newArray.index(a) 
1 
>>> del newArray[newArray.index(a)] 
>>> newArray 
['John', 'Sophia', 'Rick'] 
+1

'a'がそのリストに複数回存在するとどうなりますか? –

+0

ありがとうございました^^ – Neko

+0

@AhsanulHaqueこれはOPの質問ではありませんでしたが、 '.index()'が最初の項目のインデックスを返すので、上記のコードは単に項目の最初のインスタンスをリストから削除します。 固有の名前を扱う場合は、[Sets](https://docs.python.org/3.6/library/stdtypes.html?highlight=set#set-types-set-frozenset)を参照してください。 – phillchill

0

あなたにも、このようにそれを行うことができます。代わりに、後方

newArray = ['John','Alex','Sophia','Rick'] 

a = str(raw_input('Type your name if you want to delete : ')) 

for name in newArray: 
    if name == a: 
     newArray.remove(name) 

print newArray 
関連する問題