Python >> Tutoriel Python >  >> Python

Comment supprimer des éléments d'une liste lors de l'itération ?

Résumé  :Pour supprimer des éléments d'une liste lors de l'itération, utilisez l'une des méthodes suivantes.

  • Compréhension de la liste,
  • Itération inverse avec le remove() méthode,
  • Fonction Lambda avec le filter() méthode, ou
  • Boucle While avec le copy() , pop() et append() fonctions.

Commençons par définir le problème exact que vous souhaitez résoudre.

Problème : Étant donné une liste. Comment supprimer des éléments de la liste tout en les parcourant.

Une approche très simple et inefficace de notre problème pourrait être de parcourir la liste et de supprimer l'élément requis en fonction de la condition donnée en utilisant le remove() méthode. Voyons pourquoi l'utilisation d'une telle approche peut être désastreuse pour notre code.

Exemple : Supposons que nous ayons une liste [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] . Nous voulons supprimer tous les éléments inférieurs à 5. Suivez maintenant le programme ci-dessous :

li = list(range(10))
for b in li:
    if b < 5:
        li.remove(b)
print(li)

Le "résultat attendu" pour le programme ci-dessus est [5, 6, 7, 8, 9] . Cependant, le résultat que nous obtenons est complètement différent de nos attentes.

Sortie réelle :

[1, 3, 5, 6, 7, 8, 9]

Maintenant, vous vous demandez peut-être ce qui vient de se passer ? Il n'y a pas d'erreur dans la condition définie, alors pourquoi obtenons-nous une sortie erronée. Pas de soucis!!! La raison est assez simple et évidente une fois que vous avez regardé le visuel de ce qui se passe exactement dans notre code.

De l'explication ci-dessus, nous pouvons déduire que l'itérateur n'a aucune idée de la suppression d'un élément de la liste et passe à l'élément suivant sans aucun problème. Mais, dès qu'un élément est supprimé, il est remplacé par l'élément suivant.

Par exemple :dans la première itération, 0 est supprimé en fonction de notre condition et est remplacé par 1. Cependant, l'itérateur passe à la position suivante qui contient maintenant la valeur 2 au lieu de 1. Cela provoque la condition de notre programme à être mal interprété, ce qui entraîne une sortie erronée.

Maintenant que nous avons un aperçu de la définition du problème, examinons les solutions probables à notre problème.

Tout d'abord, commençons par un aperçu :

Exercice :Exécutez le code. La sortie est-elle la même pour chaque méthode ?

Plongeons plus profondément dans chacune des méthodes.

Méthode 1 :Utilisation de la compréhension de liste

La solution la plus simple à notre problème consiste à créer une compréhension de liste, puis à filtrer la liste source pour stocker les valeurs en fonction de la condition donnée. Les compréhensions de liste sont un moyen efficace de créer de nouvelles listes à partir d'autres listes / itérables.

Examinons le programme suivant pour comprendre le concept :

li = list(range(10))
li[:] = [x for x in li if x >= 5]
print(li)

Sortie :

[5, 6, 7, 8, 9]

Attention :évitez d'utiliser des compréhensions de liste extrêmement longues pour rendre le code convivial et éviter les complexités du code.

Méthode 2 :Itération inverse

Une autre solution de contournement à notre problème est une petite astuce. Au lieu de parcourir les éléments normalement, vous pouvez parcourir les éléments dans l'ordre inverse. Cela garantira qu'aucun élément n'est ignoré. Vous vous demandez comment ?

En effet, la suppression d'un élément dans l'ordre inverse n'affectera que les éléments qui ont déjà été traités. Une liste peut être inversée en utilisant le reversed() fonction. Examinons le code suivant pour comprendre ce concept :

li = list(range(10))
for x in reversed(li):
    if x < 5:
        li.remove(x)
print(li)

Sortie :

[5, 6, 7, 8, 9]

Méthode 3 :Utiliser une fonction Lambda

L'utilisation d'une fonction lambda peut être délicate, mais elle fournit souvent des solutions rapides à nos problèmes. La puissance de la fonction lambda peut également être exploitée dans ce cas.

Remarque :Un filter() La fonction en python peut être utilisée pour accepter une fonction et une liste comme argument. Il peut être utilisé pour filtrer les éléments d'une séquence basée sur la fonction.

Le programme suivant montre comment nous pouvons utiliser lambda pour parcourir la liste en fonction de notre condition :

li = list(range(10))
li = list(filter(lambda x: (x >= 5), li))
print(li)

Sortie :

[5, 6, 7, 8, 9]

Méthode 4 :Utilisation d'une boucle While pour faire apparaître et ajouter des éléments

Une autre solution à notre problème peut être d'utiliser une boucle while pour parcourir chaque élément de la liste et de les extraire de la liste dans une variable un par un. Vérifiez ensuite l'état de chaque élément et ajoutez-les à une autre liste en conséquence. Une fois que la liste résultante est prête, nous pouvons copier la liste nouvellement créée dans la liste d'origine, puis supprimer la liste temporaire (pour économiser de l'espace mémoire).

  • pop() : le pop() est une méthode Python intégrée qui est utilisée pour supprimer un index Python spécifié. Si aucun index n'est fourni, il supprime le dernier élément de la liste.
  • ajouter() :le append() est une méthode Python intégrée qui est utilisée pour ajouter un élément à la fin d'une liste existante sans affecter les éléments préexistants dans la liste.
  • del :le del mot-clé est utilisé pour supprimer un index particulier ou une liste entière.

Maintenant que nous avons parcouru certaines des terminologies de base pour résoudre notre problème, examinons le programme suivant pour comprendre l'utilisation du concept ci-dessus. (Veuillez suivre les commentaires pour mieux comprendre le code.)

li = list(range(10))

# creating a temporary list to store the items that meet the criteria
temp = []

# while loop to loop through the list
while li:

    # variable x holds the items of the list one by one. pop() is used to extract them from the list.
    x = li.pop()
    if x >= 5:
        # appending or adding the items that meet the criteria to the temp list
        temp.append(x)

# the temp list stores items in the reverse order. So copy them to li using reversed()
li = list(reversed(temp.copy()))

# delete the temp list to save memory
del temp
print(li)

Sortie :

[5, 6, 7, 8, 9]

Conclusion

D'après la discussion ci-dessus, nous pouvons dire en toute sécurité que pour parcourir une liste donnée et supprimer des éléments en fonction de la condition donnée, nous pouvons utiliser :

  • une compréhension de liste ou
  • une itération inverse ou
  • une fonction lambda ou
  • une boucle while générale utilisant pop() et append() les fonctions.

Une compréhension de liste est toujours la meilleure solution par rapport à l'utilisation d'une fonction de filtre car un filter() ou map() La fonction dans un programme Python peut être légèrement plus rapide dans des scénarios normaux, mais lorsqu'elle est utilisée avec une fonction lambda, elle est toujours plus lente par rapport à une compréhension de liste.

Cependant, vous êtes libre d'utiliser n'importe quelle option qui correspond à vos besoins.

J'espère que vous avez trouvé cet article utile et qu'il vous aide à parcourir une liste et à supprimer les éléments en fonction d'une condition donnée. Restez à l'écoute pour des articles plus intéressants à venir dans le futur.