Maison >développement back-end >Tutoriel Python >Pourquoi ma boucle ne parvient-elle pas à supprimer toutes les voyelles d'une chaîne lors de la modification de la liste lors de l'itération ?

Pourquoi ma boucle ne parvient-elle pas à supprimer toutes les voyelles d'une chaîne lors de la modification de la liste lors de l'itération ?

DDD
DDDoriginal
2024-12-13 19:56:17237parcourir

Why does my loop fail to remove all vowels from a string when modifying the list during iteration?

Boucle "Oublie" pour supprimer certains éléments

Dans le code ci-dessous, l'objectif est de créer une fonction appelée anti_voyelle qui élimine les voyelles d'une chaîne donnée. Bien que la fonction semble simple, elle échoue lorsqu'elle traite la chaîne "Hey look Words!", produisant "Hy lk Words!". La fonction ne parvient pas par inadvertance à supprimer le "o" final dans "look".

text = "Hey look Words!"

def anti_vowel(text):

    textlist = list(text)

    for char in textlist:
        if char.lower() in 'aeiou':
            textlist.remove(char)

    return "".join(textlist)

print anti_vowel(text)

Le problème

Le problème vient de la modification de la liste lors de l'itération. Cette approche entraîne des conséquences inattendues. Pour remédier à cela, une copie de la liste d'entrée doit être créée, permettant la suppression efficace des voyelles sans affecter la position des éléments suivants.

for char in textlist[:]: #shallow copy of the list
    # etc

Pour une meilleure compréhension, considérons le code suivant qui illustre le problème :

textlist = ['H', 'e', 'y', ' ', 'l', 'o', 'o', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!']
for char in textlist:
    print(char, textlist)

La sortie attendue serait une liste verticale de la chaîne, mais la sortie réelle est :

H ['H', 'e', 'y', ' ', 'l', 'o', 'o', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!']
e ['H', 'e', 'y', ' ', 'l', 'o', 'o', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!']
  ['H', 'y', ' ', 'l', 'o', 'o', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!'] # !
l ['H', 'y', ' ', 'l', 'o', 'o', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!']
o ['H', 'y', ' ', 'l', 'o', 'o', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!']
k ['H', 'y', ' ', 'l', 'o', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!'] # Problem!!
  ['H', 'y', ' ', 'l', 'o', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!']
W ['H', 'y', ' ', 'l', 'o', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!']
o ['H', 'y', ' ', 'l', 'o', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!'] 
d ['H', 'y', ' ', 'l', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!']
s ['H', 'y', ' ', 'l', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!']
! ['H', 'y', ' ', 'l', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!']
Hy lk Words!

Comme la boucle progresse, les éléments sont supprimés de la liste, sautant l'élément suivant. Dans le cas de « look », le deuxième « o » est ignoré car l'index a avancé au-delà de celui-ci. Par conséquent, le « o » final dans « Mots » est supprimé au lieu de celui dans « look ».

Approche recommandée

L'exploitation des compréhensions de liste de Python offre une solution plus propre et plus concise :

def remove_vowels(text): # function names should start with verbs! :)
    return ''.join(ch for ch in text if ch.lower() not in 'aeiou')

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