2017-12-28 15 views
-1

Ich mache eine Übung, wo eine Funktion eine Liste und eine ganze Zahl n nimmt und löscht jedes Element, wenn sein Index i erfüllt (i+1)%n==0. Hier ist, was ich bin gekommen, sich mit:Löschen Sie jedes Element, dessen Index die Bedingung erfüllt; List Assignment Index außerhalb des Bereichs

def f(lst, n): 
    for i in range(len(lst)): 
     if (i+1)%n==0: 
      del lst[i] 

aber es gibt mir diese Fehlermeldung:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "pop.py", line 4, in f 
    del lst[i] 
IndexError: list assignment index out of range 

Der Indexzeiger i nicht in der Lage sein scheint außer Reichweite zu laufen? Was verursacht das?

+0

Bitte geben Sie Beispieldaten für Klarheit und Tests an. –

+1

Mögliches Duplikat von [Elemente während der Iteration aus einer Liste entfernen] (https://stackoverflow.com/questions/1207406/remove-items-from-a-list-while-iterating) – abccd

+0

Denken Sie darüber nach, was passiert, wenn Sie Elemente entfernen aus einer Liste. Die Länge dieser Liste ändert sich. –

Antwort

2

Welchen Datensatz verwenden Sie? Abhängig von den Zahlen in Ihrem Datensatz besteht das Problem darin, dass Sie Objekte aus Ihrer Liste löschen, wodurch ein Konflikt entsteht, wenn Sie nach einem bestimmten Index in dieser Liste fragen.

ex_list = [2, 5, 12] 
print range(len(ex_list)) 

output [0, 1, 2] 

Also sagen wir, das erste Element besteht nicht Ihren Test und wird gelöscht. Jetzt oyur Liste sieht wie folgt aus:

ex_list 
>>>[5, 12] 

Das Problem ist, dass Ihr nächstes i in Ihrer for-Schleife 1 sein wird, aber jetzt:

ex_list[1] 
>>>12 

und schließlich:

ex_list[2] 
>>>IndexError: list assignment index out of range 
1

Was ist Wenn Sie ein Element aus einer Liste löschen, ändert sich Ihre Listengröße.

Sie müssen nicht über die Liste iterieren, um die Indizes zu finden, die durch n teilbar sind.
für z.B. Wenn list_length = 8 und n = 2, dann wissen wir, dass das Element # [2,4,6,8] = index [1,3,5,7] gelöscht werden muss. Sie können nur einen Filter erstellen hier oder Liste Verständnis, wie diese auch

new_list = [old_list[i] for i in range(len(old_list_length)) if (i+1) % n == 0] 
old_list = new_list 

Hinweis do- werden: - Sie können Iterierte über eine Liste beachten, in dem ein Element gelöscht wurde, da das ursprüngliche Element Sie löschen, wird nun einen anderen Index haben. Gehen wir mit dem Beispiel am Anfang der Antwort: - lässt Sie sagen, Sie haben element#2(index = 1) gelöscht, jetzt wird element#4,#8 jetzt element #3, #7, so dass Sie jetzt nicht die ursprünglichen Elemente verfolgen können, die Sie die Liste entfernen wollten.

Verwandte Themen