Maison >développement back-end >Tutoriel Python >Pourquoi la suppression itérative d'éléments d'une liste Python produit-elle des résultats inattendus ?

Pourquoi la suppression itérative d'éléments d'une liste Python produit-elle des résultats inattendus ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-23 06:01:13261parcourir

Why Does Iteratively Removing Items from a Python List Produce Unexpected Results?

Comportement étrange lors de la suppression itérative d'éléments en Python

En Python, des résultats étranges peuvent se produire lors de la suppression d'éléments d'une liste au cours d'une itération. Considérez le code suivant :

numbers = list(range(1, 50))

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

print(numbers)

Sortie attendue : [20, 21, ..., 49]

Sortie réelle : [2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 21, ..., 49]

Raison :

Le problème vient de la modification de la liste lors de l'itération. Lors de la première itération de la boucle, 1 est supprimé. Cependant, l'itération suivante ne pointe plus vers 2 dans la liste raccourcie mais vers 3. Cela continue jusqu'à ce qu'il ne reste que des éléments supérieurs à 20.

Solutions :

  • Liste Compréhension :
numbers = [n for n in numbers if n >= 20]
  • Modification sur place :
numbers[:] = (n for n in numbers if n >= 20)
  • Avant Traitement avec générateur Expression :
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]

Il est important de noter que modifier la longueur d'une liste lors d'une itération n'est généralement pas recommandé. Les solutions proposées offrent des approches alternatives pour atteindre le résultat souhaité.

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:
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