Le comte de lettres dans un mot en python de débogage
Je suis en train de compter le nombre de " e " apparaît dans un mot.
def has_no_e(word): #counts 'e's in a word
letters = len(word)
count = 0
while letters >= 0:
if word[letters-1] == 'e':
count = count + 1
letters = letters - 1
print count
Il semble que cela fonctionne bien sauf lorsque le mot se termine par un "e". Il comptera que 'e' deux fois. Je n'ai aucune idée pourquoi. Toute aide?
Je sais que mon code ne peut être bâclée, je suis un débutant! Je suis juste essayer de comprendre la logique derrière ce qui se passe.
Quand les lettres == 0 ce qui va arriver? Pourquoi êtes-vous tester pour
while letters >= 0
? Pouvez-vous expliquer pourquoi vous êtes en train de faire cela? Une explication serait utile.OriginalL'auteur Johnny | 2010-12-30
Vous devez vous connecter pour publier un commentaire.
Que d'autres mentionnent, vous pouvez mettre en œuvre le test avec un simple
word.count('e')
. Sauf si vous faites cela comme un simple exercice, c'est beaucoup mieux que d'essayer de réinventer la roue.Le problème avec votre code est qu'il compte le dernier caractère à deux reprises parce que vous passez le test de l'indice de
-1
à la fin, ce qui en Python renvoie le dernier caractère de la chaîne. Réparer en changeantwhile letters >= 0
àwhile letters > 0
.Il y a d'autres façons que vous pouvez nettoyer votre code (en supposant que c'est un exercice d'apprentissage):
for
boucle. C'est beaucoup plus concis et plus facile à lire qu'à l'aide d'unwhile
boucle et de maintenir votre propre variable de compteur. Comme vous l'avez déjà vu ici, en ajoutant de la complexité des résultats dans les bogues. Garder les choses simples.+=
opérateur, qui pour les entiers ajoute le montant d'une variable. C'est plus concis quecount = count + 1
.char='e'
dans la liste des paramètres lorsque vous avez un évident défaut.has_no_e()
rend le lecteur pense que le code vérifie si le code n'a pas e, mais ce qu'il fait réellement est compte les occurrences de e.Mettre tous ensemble, nous obtenons:
Quelques tests:
OriginalL'auteur marcog
Pourquoi pas?
OriginalL'auteur user225312
Pourquoi ne pas tout simplement
OriginalL'auteur Tim Pietzcker
Le problème est que la dernière valeur de 'lettres' dans votre itération est "0", et quand cela arrive vous regardez:
sens, vous regardez word[-1], qui en python signifie "la dernière lettre du mot".
si vous êtes réellement en compte correctement, et l'ajout d'un "bonus" si la dernière lettre est un "e".
OriginalL'auteur Yonatan
Il va compter deux fois quand se terminant par un e parce que vous décrémenter
letters
une fois de trop (parce qu'on boucle tout enletters >= 0
et vous devriez être en boucle tout enletters > 0
). Lorsqueletters
atteint zéro, vous vérifiezword[letters-1]
==word[-1]
qui correspond à la dernière lettre dans le mot.OriginalL'auteur Klaus Byskov Pedersen
Beaucoup de ces solutions fonctionnent bien.
Savoir que, en Python, liste[-1] renvoie le dernier élément de la liste.
Donc, dans votre code, quand vous étiez référencement word[lettres-1] dans une boucle while contraint par lettres >= 0, le " e " à la fin du mot deux fois (une fois, quand les lettres a la longueur-1 et une seconde fois lorsque les lettres a 0).
Par exemple, si ma parole a été "Pete" votre code de trace devrait ressembler à ceci (si vous avez imprimé le mot[lettre] de chaque boucle.
e (pour word[3])
t (pour word[2])
e (pour word[1])
P (mot[0])
e (pour word[-1])
Espère que cela aide à clarifier les choses et de révéler un intéressant petit caprice à propos de Python.
OriginalL'auteur sjberry
@marcog fait quelques excellents points;
en attendant, vous pouvez faire la correction simple en insérant des instructions d'impression -
puis
retourne
à partir de laquelle vous pouvez voir que
OriginalL'auteur Hugh Bothwell
Si ce que vous voulez vraiment est "has_no_e", alors ce qui suit peut être plus approprié que le comptage 'e s et puis plus tard, la vérification de zéro,
Si vous voulez vérifier si il n'y a pas de "E", soit,
OriginalL'auteur aid
Vous n'avez pas à utiliser un tout en boucle. Les chaînes peuvent être utilisés pour des boucles dans Python.
ou quelque chose de plus simple:
OriginalL'auteur Nope