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
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.
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!