Python >> Tutoriel Python >  >> Python

Python - Comment modifier une séquence tout en itérant dessus ?

La modification d'une séquence tout en l'itérant peut entraîner un comportement indésirable en raison de la manière dont l'itérateur est construit. Pour éviter ce problème, une solution simple consiste à parcourir une copie de la liste. Par exemple, vous obtiendrez une copie de list_1 en utilisant la notation slice avec les valeurs par défaut list_1[:] . Étant donné que vous parcourez une copie de la liste, vous pouvez modifier la liste d'origine sans endommager l'itérateur.

Dans l'article rapide suivant, j'expliquerai ce problème et sa solution plus en détail. Allons-y !

Problème :Soit une séquence telle qu'une liste Python en Python. Comment modifier la séquence en itérant dessus ?

Exemple :Supposons que vous ayez une liste Python de chaînes :

# Given list of strings
words = ['cat', 'mouse', 'dog']

Vous souhaitez parcourir chaque élément et vérifier s'il contient plus de 3 caractères. Si c'est le cas, vous souhaitez l'insérer au début afin que toutes les chaînes de plus de 3 caractères soient placées au début. Vous désirez la liste suivante avec le mot à 4 caractères « souris » placé au début de la liste :

# Your desired result:
words = ['mouse', 'cat', 'dog']

Pourquoi est-ce un problème difficile ?

Ce problème n'est pas aussi simple que de supprimer des éléments d'une séquence sur laquelle vous itérez. Cela peut entraîner un comportement non spécifié, comme expliqué ci-dessous.

Avant d'entrer dans la boucle for, l'interpréteur Python crée un objet itérateur. L'objet itérateur fournit une méthode next() renvoyant l'élément suivant dans la séquence.

Pour cela, l'itérateur extrait, à la création, des informations comme la taille de la séquence. Si vous modifiez la séquence « à la volée », cette information devient invalide.
Par exemple, si le nombre d'éléments change au moment de l'exécution, l'objet itérateur peut croire qu'il est prêt, alors qu'il contient encore des objets.

Solution :Le code suivant fournit une solution simple :itérer sur une copie de la liste en utilisant la notation de découpage. En d'autres termes, le code copie d'abord la liste et parcourt la copie. Avec cette méthode, nous pouvons modifier en toute sécurité la liste d'origine car cela n'affectera en rien la copie. La notation slice est un moyen très pratique de copier des séquences.

words = ['cat', 'mouse', 'dog']
for w in words[:]:
    if len(w) > 3:
        words.insert(0, w)
print(words)

Si vous utilisez cet extrait de code, le premier élément de la liste sera 'mouse' —et le résultat est :

# Your desired result:
words = ['mouse', 'cat', 'dog']

Vous pouvez résoudre un puzzle connexe sur notre application Finxter.com pour améliorer votre compréhension des opérateurs Python de base et vous amuser en même temps ! 🙂

Exercice  :Devinez :quel est le résultat de ce puzzle de code ?

Êtes-vous un codeur maître?
Testez vos compétences maintenant !

Vous pouvez regarder une vidéo connexe ici :