Vous êtes à la modification de la liste que vous avez à parcourir, qui est lié à la suite de certains comportements non-intuitifs. Au lieu de cela, faire une copie de la liste afin de ne pas supprimer des éléments à partir de ce que vous êtes à itérer.
for char in textlist[:]: #shallow copy of the list
# etc
Afin de clarifier le comportement que vous voyez, vérifier cela. Mettre print char, textlist
au début de votre (original) en boucle. Vous vous attendez peut-être que ce serait d'imprimer votre chaîne à la verticale, à côté de la liste, mais ce que vous obtenez en fait est-ce:
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!
Alors que ce passe? Le gentil for x in y
boucle en Python est vraiment juste sucre syntaxique: il continue d'accéder à la liste des éléments par index. Ainsi, lorsque vous supprimez des éléments de la liste lors de l'itération sur elle, vous commencez à sauter des valeurs (comme vous pouvez le voir ci-dessus). En conséquence, vous ne voyez jamais la deuxième o
en "look"
; vous l'ignorer parce que l'indice a progressé "passé" lorsque vous avez supprimé l'élément précédent. Puis, quand vous arrivez à l' o
en "Words"
, vous allez supprimer la première occurrence d' 'o'
, qui est celui que vous avez sauté l'avant.
Comme d'autres l'ont mentionné, les interprétations de la liste sont probablement encore mieux (plus propre, plus claire). Utilisez le fait que Python chaînes sont itératif:
def remove_vowels(text): # function names should start with verbs! :)
return ''.join(ch for ch in text if ch.lower() not in 'aeiou')