2017-06-05 4 views
1

Meine Frage kann ein bisschen seltsam und einfach aussehen, aber ich kann keine befriedigende Antwort finden. Ich möchte auf einer Liste iterieren und Elemente daraus entfernen. Das Problem tritt auf, wenn nach einem Löschvorgang noch ein Element in der Liste vorhanden ist: Die Schleife wird nicht auf dem letzten Element durchlaufen, als ob die Liste leer wäre.Dynamisches Entfernen eines Elements aus einer Liste

ich bin mit für .. in .. wie im folgenden Beispiel:

def test_remove(self): 
    """Test to remove all values from a list.""" 
    test = [4, 5] 
    [test.remove(i) for i in test] 
    print test 

ich die folgende Ausgabe bin immer:

[5] 

Bedeutet es, dass, wie ich Iterieren tue Auf einer Liste wird die Liste nicht dynamisch skaliert, wenn ein Element gelöscht wird (dasselbe passiert mit i für i in range())? Oder ist es nur, weil ich einfach i = len erreiche, und so kann ich nicht weiter gehen?

Ich könnte immer schummeln und überprüfen, wenn die len gleich 1 ist, aber ich würde gerne verstehen, wenn es eine schönere Möglichkeit ist, dies zu tun.

Vielen Dank.

Antwort

1

Das Problem ist, dass, wie Sie die Elemente aus der Liste entfernen Die anderen Elemente ändern ihre Positionen, was dazu führt, dass einige davon übersprungen werden, während die Schleife weiterläuft. Versuchen Sie es mit mehr Elementen und Sie werden sehen, wie das Überspringen einem Muster folgt.

Um dies zu vermeiden, müssen Sie die Liste anders und meiner Meinung nach rückwärts durchlaufen. Folgendes könnte

Ein Weg, es zu tun:

i = len(test)-1 
    while (i>=0): 
     del test[i] 
     i-=1 
    print(test) 
+0

Ja das habe ich endlich gemacht. Ich dachte für in war in der Lage, diese Art von Loop-Strukturierung zu vermeiden. Vielen Dank :) – Ecterion

1

Sie können zwar keine For-In-Schleife oder Listenverstehen durchführen, während Sie Änderungen an diesem iterablen Wert vornehmen. Am einfachsten ist es, eine While-Schleife zu verwenden

while len(test): 
    test.pop() 
+0

Danke für die Antwort. In meinem Fall kann ich .pop() jedoch nicht verwenden, um ein Element aus meiner Liste zu entfernen, da ich am Anfang der Liste beginnen muss und das Element möglicherweise entfernen kann oder nicht, wenn ich darauf iteriere. Es hängt von einigen Bedingungen ab. Ich schätze, ich werde im Moment eine einfache Längenkontrolle machen. – Ecterion

0

Es ist nicht nur das letzte Element, es ist jedes seltsame Element - testen Sie es auf einer längeren Liste. Dies liegt daran, dass beim Löschen von Elementen alle anderen Elemente die Position wechseln. Der beste Weg, um es zu kopieren ist wahrscheinlich, die Elemente zu kopieren, die Sie nicht in eine neue Liste entfernen möchten.

0

Als Ihre Beschreibung können Sie auch durch diese Art und Weise gehen.

ls = [1,2,3,4] 
ls_length = len(ls) 
i = 0 
condition_satisfied = True 
while ls_length: 
    if i<ls_length: 
     test_num = ls[i] 
     i = i + 1 
     if condition_satisfied: 
      ls.remove(test_num) 
      ls_length = len(ls) 
      i = 0 
print(ls) 
0

Verwendung:

for (Iterator<String> iter = list.listIterator(); iter.hasNext();){ 
    String a = iter.next(); 
    if (...) {    
     iter.remove(); 
     }  
    } 

den Code verwenden, wie oben; es wird klappen. Es funktionierte für mich, alle Elemente von der Liste zu entfernen.

Verwandte Themen