Maison  >  Article  >  développement back-end  >  Résultats étranges lors de la suppression d'éléments de la liste lors d'une itération sur la liste en Python

Résultats étranges lors de la suppression d'éléments de la liste lors d'une itération sur la liste en Python

WBOY
WBOYavant
2024-02-09 10:10:04677parcourir

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

Contenu de la question

J'ai ce code :

numbers = list(range(1, 50))

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

print(numbers)

Cependant, le résultat que j'obtiens est :

[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]

Bien sûr, j'espère qu'il n'y aura pas de chiffres inférieurs à 20 dans les résultats. On dirait que j'ai fait quelque chose de mal lors de la suppression.


Bonne réponse


Vous modifiez la liste en l'itérant. Cela signifie qu'au premier passage dans la boucle, la valeur de i == 1,因此1被从列表中删除。然后for循环转到列表中的第二项,它不是2,而是3!然后将其从列表中删除,然后 for 循环继续执行列表中的第三项,现在是 5。依此类推。也许这样更容易可视化,用 ^ 指向 i est :

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

C'est l'état initial de la liste ; puis 1 est supprimé et la boucle passe au deuxième élément de la liste :

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

Attendez.

Il n'existe pas de bon moyen de modifier la longueur d'une liste tout en la parcourant. La meilleure chose que vous puissiez faire est la suivante :

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

Ou ceci, pour les changements sur place (l'élément entre parenthèses est une expression génératrice qui est implicitement convertie en tuple avant l'affectation de la tranche) :

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

Si vous souhaitez agir sur n avant de le supprimer, une astuce que vous pouvez essayer est la suivante :

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]

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer