2017-05-05 38 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

環路向後代替'對於我在範圍內(len(newArray)-1,-1,-1)' –

回答

0

隨着循環的進展,一旦你從newArray中刪除了一個項目,就不可能到達for循環的結尾。如果len(newArray)現在是3,則無法獲得第四個元素,因此newArray[3]會引發錯誤。

更多Pythonic的做法可能是使用列表理解。

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

你並不需要一個for循環這樣的:

>>> 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