2017-01-22 5 views
-1
for i in range(0,len(text_list)): 
    if (text_list[i] == "!" and text_list[i+1].isupper()): 
     print "something" 
    else: 
     text_list.pop(i) 

Traceback (jüngste Aufforderung zuletzt):Listenindex außerhalb des zulässigen Bereichs, Python Fehlerbehebung

File "test.py", line 12, in <module> 
    if (text_list[i]=="!" and text_list[i+1].isupper()): 

Fehler:

IndexError: list index out of range 

Ich möchte alle Ausrufezeichen von a entfernen Textdatei, die nicht am Ende eines Satzes stehen.

+0

Es ist nicht klar, welcher Teil des Problems für Sie verwirrend ist. Wenn Sie nur die Fehlermeldung googlen, bin ich sicher, dass Sie eine Antwort finden würden. – csmckelvey

+0

Wenn text_list eine Zeichenfolge und keine Liste ist, können Sie pop nicht verwenden. Zweitens, wenn Ihre Bedingung ein Ausrufezeichen gefolgt von einem Großbuchstabe ist, ist das leicht mit Regex lösbar. – TGO

Antwort

0

Wenn Sie den letzten Index der text_list werden, dann wird Ihnen "text_list [i + 1] .isupper()" einen Fehler geben, weil i + 1 außerhalb des Indexbereichs liegt. Sie können etwas tun:

for i in range(0,len(text_list)): 
    if(i!=len(text_list-1)): 
     if (text_list[i]=="!" and text_list[i+1].isupper()):     
      print "something" 
     else: 
      text_list.pop(i) 
+0

Warum nicht 'range (0, len (text_list) -1)' anstelle von 'if (i! = Len (text_list - 1))? – kouty

+0

Ja das ist auch richtig, infact mit 'range (0, len (text_list) -1)' wird eine gute Praxis sein. –

0

Wenn ilen(text_list) - 1 wird, i + i außerhalb der Grenzen ist. Das ist dein erstes Problem. Das zweite Problem besteht darin, dass Sie innerhalb der for-Schleife platzen. Dies ändert die Größe der Liste.

Ich schlage vor, die zu entfernenden Indizes in einer separaten Liste zu speichern und sie dann nach Abschluss der Schleife zu öffnen.

to_remove = [] 

for i in range(0,len(text_list) - 1): 
    if (text_list[i]=="!" and text_list[i+1].isupper()):     
     print "something" 
    else: 
     to_remove.append(i) 

for i in reversed(to_remove): 
    text_list.pop(i) # use del if you don't need the popped value 
Verwandte Themen