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

WBOY
Libérer: 2024-02-09 10:10:04
avant
676 Les gens l'ont consulté

在 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)
Copier après la connexion

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...]
 ^
Copier après la connexion

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...]
       ^
Copier après la connexion

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]
Copier après la connexion

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)
Copier après la connexion

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]
Copier après la connexion

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!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!