[PYTHON] Changer la liste dans l'instruction for

Objectif

Conclusion

Il y a un problème subtil de changement de séquence dans une boucle de commentaires (cela ne peut se produire qu'avec des séquences mutables, par exemple des listes). Un compteur interne est utilisé pour garder une trace de quel élément est utilisé ensuite, et ce compteur est incrémenté à chaque itération. La boucle se termine lorsque ce compteur atteint la longueur de la séquence. À partir de là, la suppression de l'élément actuel (ou précédent) de la séquence dans la suite saute l'élément suivant (car la position de l'élément suivant est l'index de l'élément actuel qui a déjà été traité). Ce sera. De même, si vous insérez un élément dans la suite avant l'élément courant dans la séquence, l'élément courant sera traité à nouveau dans la semaine suivante de la boucle. Ces spécifications conduisent à des bugs désagréables. Cela peut être évité en effectuant une copie temporaire en utilisant des tranches de la séquence entière.

officiel.py


for x in a[:]:
    if x < 0: a.remove(x)

Contexte

Comment ça s'ecrit? Que devrais-je faire?

C'est buggy

L'élément de foo_list qui est retourné par l'instruction for a été supprimé dans la séquence. Cela peut empêcher la liste d'être tournée vers la fin.

bug.py


for i in foo_list:
  if thres >= i:
      foo_list.remove(i)

Je veux écrire ceci quand j'essaye d'éviter le bug

Commencez par activer toutes les instructions for. Notez l'élément que vous souhaitez effacer. Tournez le contenu du mémod avec pour pour le supprimer.

Gênant

no_good.py


memo = []
for i in range(len(foo_list)):
    if thres >= foo_list[i]:
      memo.append(foo_list[i])

for item in memo:
    foo_list.remove(item)

Vous pouvez écrire proprement en vous référant à la formule

Créez un nouvel objet de liste en découpant toute la plage de la liste spécifiée par l'instruction for C'est la même chose que ʻa = foo_list [:] `quand vous voulez copier

beautiful.py


for i in foo_list[:]:
  if thres >= i:
      foo_list.remove(i)

Au fait, si vous souhaitez simplement filtrer comme ci-dessus, la notation d'inclusion est meilleure comme indiqué par @shiracamus ci-dessous. Ensuite, j'ajouterai l'histoire de son utilisation à nouveau.

@shiracamus Ne serait-il pas plus rapide de créer une nouvelle liste en inclusion que de la supprimer de la liste?

foo_list = [i for i in foo_list if thres >= i]

Recommended Posts

Changer la liste dans l'instruction for
[Introduction à Python] Comment utiliser l'opérateur in dans l'instruction for?
Copiez la liste en Python
Obtenir uniquement les éléments de sous-classe dans une liste
Liste Python, pour instruction, dictionnaire
Enregistrer une tâche dans cron pour la première fois
Méthodes disponibles dans la liste
Pratique pour utiliser les sous-graphiques matplotlib dans l'instruction for
Transformez plusieurs listes avec l'instruction for en même temps en Python
[Python / PyQ] 4. liste, pour instruction
Lorsque vous voulez plt.save dans l'instruction for
Changer la destination de sortie standard en un fichier en Python
Remarques sur l'intégration du langage de script dans les scripts bash
Remarque 2 pour intégrer le langage de script dans un script bash
Obtenez le nombre d'éléments spécifiques dans la liste python
Comment définir plusieurs variables dans une instruction Python for
Comment obtenir la dernière (dernière) valeur d'une liste en Python
Obtenez le nombre d'occurrences pour chaque élément de la liste
Créer une nouvelle liste en combinant des éléments en double dans la liste
[python] Gérer les fonctions dans une liste
Lors de la création d'une matrice dans une liste
Analysez l'API Researchmap avec Python et créez automatiquement un fichier Word pour la liste des succès
Exporter la liste de clés incluse dans S3 Bucket dans un fichier
Instruction Loop For inversée dans un fichier HTML sur Django
Changez l'invite de bash en une couleur simple pour une visualisation facile
Mettre ensemble des valeurs consécutives dans la liste
Afficher une liste d'alphabets en Python 3
Découvrez les dates du tournoi fou
Prenez la somme logique de List en Python (fonction zip)
Exécuter l'interpréteur Python dans le script
MongoDB avec Python pour la première fois
Obtenez un jeton pour conoha avec python
Obtenir la liste de codes EDINET en Python
Disposez les nombres en forme de spirale
[Introduction à Udemy Python3 + Application] 47. Traitez le dictionnaire avec une instruction for
[Linux] Une commande pour obtenir une liste des commandes exécutées dans le passé
Je souhaite trier une liste dans l'ordre des autres listes
Recevez une liste des résultats du traitement parallèle en Python avec starmap
Une note utile lors de l'utilisation de Python après une longue période
[Python] Comment créer une liste de types de dictionnaire, ajouter / modifier / supprimer des éléments et extraire avec une instruction for
[IOS] Modifiez la durée d'affichage de chaque image de l'animation GIF dans Pythonista3.
Comment passer le résultat de l'exécution d'une commande shell dans une liste en Python
CERTIFICATE_VERIFY_FAILED dans Python 3.6, le programme d'installation officiel de macOS
[Python] Récupérez les fichiers dans le dossier avec Python
Prétraitement de texte japonais sans instruction for dans les pandas
Utilisez autre chose qu'une chaîne <br> pour la clé <br> dict en Python
Recevoir et traiter n objets dans une liste
[Python] Trier la liste de pathlib.Path dans l'ordre naturel
Création d'un wrapper Python pour l'API Qiita
Comment effacer un taple dans une liste (Python)
Modifiez l'étiquette du périphérique (lecteur) au format vfat.
Utilisez le dernier pip dans un environnement virtualenv
Changer la taille de police de la légende dans df.plot
Modifier le référentiel de référence par défaut pour l'installation de pip
Récupérer l'appelant d'une fonction en Python
Remarques sur la personnalisation de la classe de liste de dict
Faire un histogramme pour le moment (matplotlib)
Extrayez le nom du produit et le prix de la liste de produits dans l'e-mail de déclaration d'achat de Yodobashi.com.
Trouvez le nombre de jours dans un mois
Programme pour rechercher la même image