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

WBOY
Freigeben: 2024-02-09 10:10:04
nach vorne
676 Leute haben es durchsucht

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

Frageninhalt

Ich habe diesen Code:

numbers = list(range(1, 50))

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

print(numbers)
Nach dem Login kopieren

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...]
 ^
Nach dem Login kopieren

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...]
       ^
Nach dem Login kopieren

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]
Nach dem Login kopieren

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)
Nach dem Login kopieren

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]
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!