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
Libérer: 2024-12-13 19:56:17
original
234 Les gens l'ont consulté

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)
Copier après la connexion

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
Copier après la connexion

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)
Copier après la connexion

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!
Copier après la connexion

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')
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal