[PYTHON] Points à noter lors de la suppression de plusieurs éléments de la liste

Qu'est-il arrivé

Il y a plusieurs éléments à supprimer dans la liste, et lorsque je les ai supprimés en boucle sans penser à rien, j'ai trouvé un élément qui correspond aux conditions mais qui n'est pas supprimé.

Cause

C'était si simple que je l'ai scanné à partir du haut de la liste et l'ai supprimé, donc la combinaison d'index et d'élément était erronée, et l'élément qui avait été initialement supprimé est resté.

solution de contournement

Changé pour analyser la liste dans l'ordre inverse

Avant de traiter

lst = [1, 2, 3]
for i in lst:
    if i in (1, 2):
        lst.remove(i)
print(lst)
#Résultat d'exécution
[2, 3]

Après avoir traité

lst = [1, 2, 3]
for I in reversed(lst):
    if i in (1, 2):
        lst.remove(i)
print(lst)
#Résultat d'exécution
[3]

Commentaire

Si vous le supprimez du haut de la liste, les éléments seront compressés, mais l'index restera le même. Par conséquent, l'élément supprimé suivant est compressé et non traité. La suppression de la liste à l'arrière empêche le prochain élément à juger d'être emballé.

Vérification

Avant la correspondance

>>> lst = [1, 2, 3]
>>> for i, l in enumerate(lst):
...     print("index:%s, value:%s, list:%s" % (i, l, lst))
...     if l in (1, 2):
...             lst.remove(l)
...     print("index:%s, value:%s, list:%s" % (i, l, lst))
...
index:0, value:1, list:[1, 2, 3]
index:0, value:1, list:[2, 3]
index:1, value:3, list:[2, 3]
index:1, value:3, list:[2, 3]

Puisque la valeur est «3» lorsque l'indice est «1», «2», qui devrait être supprimé par le jugement, n'est pas traité. (Si l'index est «1», la valeur est «2» selon la liste d'origine) Faites ceci dans l'ordre inverse.

Après la correspondance

>>> lst = [1, 2, 3]
>>> for i, l in enumerate(reversed(lst)):
...     print("index:%s, value:%s, list:%s" % (i, l, lst))
...     if l in (1, 2):
...             lst.remove(l)
...     print("index:%s, value:%s, list:%s" % (i, l, lst))
...
index:0, value:3, list:[1, 2, 3]
index:0, value:3, list:[1, 2, 3]
index:1, value:2, list:[1, 2, 3]
index:1, value:2, list:[1, 3]
index:2, value:1, list:[1, 3]
index:2, value:1, list:[3]

Choses à surveiller

Jusqu'à présent, lors de la suppression avec ** élément **. Une chose à faire attention est lors de la suppression avec ** index **. Lors de la suppression avec ** index **, cette méthode d'écriture entraînera une erreur.

>>> lst = [1, 2, 3]
>>> for i, l in enumerate(reversed(lst)):
...     print("index:%s, value:%s, list:%s" % (i, l, lst))
...     if l in (1, 2):
...             del lst[i]
...     print("index:%s, value:%s, list:%s" % (i, l, lst))
...
index:0, value:3, list:[1, 2, 3]
index:0, value:3, list:[1, 2, 3]
index:1, value:2, list:[1, 2, 3]
index:1, value:2, list:[1, 3]
index:2, value:1, list:[1, 3]
Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
IndexError: list assignment index out of range

Dans ce cas, il peut être traité comme suit.

>>> lst = [1, 2, 3]
>>> for i, l in reversed(list(enumerate(lst))):
...     print("index:%s, value:%s, list:%s" % (i, l, lst))
...     if l in (1, 2):
...             del lst[i]
...     print("index:%s, value:%s, list:%s" % (i, l, lst))
...
index:2, value:3, list:[1, 2, 3]
index:2, value:3, list:[1, 2, 3]
index:1, value:2, list:[1, 2, 3]
index:1, value:2, list:[1, 3]
index:0, value:1, list:[1, 3]
index:0, value:1, list:[3]

Recommended Posts

Points à noter lors de la suppression de plusieurs éléments de la liste
Points à noter lors du passage de NAOqi OS 2.4.3 à 2.5.5
[Python] Solution au problème que les éléments sont liés lors de la copie d'une liste
Précautions lors de l'exécution de la régression logistique avec Statsmodels
Choses à noter lors de l'initialisation d'une liste en Python
Coloration des points en fonction de la distance de la courbe de régression
(Note) Points auxquels il faut être accro lors de l'installation de Scilab sur ArchLinux
Extraire la valeur la plus proche d'une valeur à partir d'un élément de liste en Python
Points à noter lorsque les pandas lisent le csv de la sortie Excel
Précautions lors de l'exécution de Python sur EC2 à partir d'AWS Lambda (Exécuter la commande)
Lorsque vous souhaitez trier une liste multidimensionnelle sur plusieurs lignes
Dans la commande python, python pointe vers python3.8
Supprimer plusieurs éléments dans la liste python
Extension de Python par C ou C ++ (lorsqu'il y a plusieurs arguments, lors du passage d'une liste du côté Python)
Supprimer ou récupérer des tableaux de fasta en fonction du fichier de liste d'ID
Remarque Python: lorsque vous souhaitez connaître les attributs d'un objet
Lors de l'exécution d'un shell Python à partir d'Electron, transmettez plusieurs arguments pour exécuter Python.
Points à considérer lors de l'utilisation de l'API de SoftLayer à partir d'une application sur Bluemix
[Note] [PyTorch] De l'installation à la simplicité d'utilisation
Comment utiliser le multicœur du point de vue de plusieurs langues
Comment faire fonctionner Linux depuis la console
Python amateur tente de résumer la liste ①
Joindre les éléments de la liste sans «». (Récupérer la chaîne de la liste sans '')
Comment accéder à la banque de données de l'extérieur
Remarque DJango: depuis le début (traitement de formulaire)
[Astuces Python] Comment récupérer plusieurs clés avec la valeur maximale du dictionnaire