Heim  >  Artikel  >  Backend-Entwicklung  >  Seltsame Ergebnisse beim Entfernen von Elementen aus der Liste beim Durchlaufen der Liste in Python

Seltsame Ergebnisse beim Entfernen von Elementen aus der Liste beim Durchlaufen der Liste in Python

WBOY
WBOYnach vorne
2024-02-09 10:10:04677Durchsuche

在 Python 中迭代列表时从列表中删除项目时出现奇怪的结果

Frageninhalt

Ich habe diesen Code:

numbers = list(range(1, 50))

for i in numbers:
    if i < 20:
        numbers.remove(i)

print(numbers)

Das Ergebnis, das ich bekomme, ist jedoch:

[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49]

Natürlich hoffe ich, dass es in den Ergebnissen keine Zahlen unter 20 gibt. Anscheinend habe ich beim Löschen etwas falsch gemacht.


Richtige Antwort


Sie ändern die Liste, während Sie sie iterieren. Dies bedeutet, dass beim ersten Durchlaufen der Schleife der Wert von i == 1,因此1被从列表中删除。然后for循环转到列表中的第二项,它不是2,而是3!然后将其从列表中删除,然后 for 循环继续执行列表中的第三项,现在是 5。依此类推。也许这样更容易可视化,用 ^ 指向 i ist:

[1, 2, 3, 4, 5, 6...]
 ^

Dies ist der Anfangszustand der Liste; dann wird 1 entfernt und die Schleife geht zum zweiten Element in der Liste:

[2, 3, 4, 5, 6...]
    ^
[2, 4, 5, 6...]
       ^

Warte.

Es gibt keine gute Möglichkeit, die Länge einer Liste zu ändern, während man darüber iteriert. Das Beste, was Sie tun können, ist Folgendes:

numbers = [n for n in numbers if n >= 20]

Oder dies für direkte Änderungen (das Ding in den Klammern ist ein Generatorausdruck, der vor der Slice-Zuweisung implizit in ein Tupel konvertiert wird):

numbers[:] = (n for n in numbers if n >= 20)

Wenn Sie vor dem Löschen Maßnahmen ergreifen möchten, können Sie Folgendes ausprobieren: n

for i, n in enumerate(numbers):
    if n < 20:
        print("do something")
        numbers[i] = None
numbers = [n for n in numbers if n is not None]

Das obige ist der detaillierte Inhalt vonSeltsame Ergebnisse beim Entfernen von Elementen aus der Liste beim Durchlaufen der Liste in Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen