2010-12-30 10 views
3

Ich versuche zu zählen, wie oft "e" in einem Wort erscheint.Zähle Buchstaben in einem Wort in Python debug

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 

Es scheint gut zu funktionieren, außer wenn das Wort mit einem 'e' endet. Es wird das 'e' zweimal zählen. Ich habe keine Idee warum. Irgendeine Hilfe?

Ich weiß, dass mein Code schlampig sein kann, ich bin ein Anfänger! Ich versuche nur, die Logik dahinter herauszufinden.

+0

Wenn Buchstaben == 0 was wird passieren? Warum testen Sie für 'while letters> = 0'? Kannst du mir erklären warum du das tust? Eine Erklärung wäre hilfreich. –

Antwort

9

Wie andere erwähnt, können Sie den Test mit einem einfachen word.count('e') implementieren können. Wenn Sie dies nicht als einfache Übung machen, ist das viel besser als das Rad neu zu erfinden.

Das Problem mit Ihrem Code ist, dass es das letzte Zeichen zweimal zählt, weil Sie den Index -1 am Ende testen, die in Python das letzte Zeichen in der Zeichenfolge zurückgibt. Beheben Sie es, indem Sie while letters >= 0 zu while letters > 0 ändern.

Es gibt auch andere Möglichkeiten, wie Sie Ihren Code aufzuräumen können (vorausgesetzt, dies ist eine Übung in Lernen):

  • Python bietet eine schöne Art und Weise über eine Reihe von Iterieren eine for Schleife. Dies ist viel prägnanter und einfacher zu lesen als mit einer while Schleife und die eigene Zählervariable zu verwalten. Wie Sie bereits gesehen haben, führt das Hinzufügen von Komplexität zu Fehlern. Halte es einfach.
  • Die meisten Sprachen bieten einen Operator +=, der für Ganzzahlen die Menge zu einer Variablen hinzufügt. Es ist prägnanter als count = count + 1.
  • Verwenden Sie einen Parameter, um zu definieren, welches Zeichen Sie zählen, um es flexibler zu machen. Definieren Sie ein Standardargument für die Verwendung von char='e' in der Parameterliste, wenn Sie einen offensichtlichen Standardwert haben.
  • Wählen Sie einen passenderen Namen für die Funktion. Der Name has_no_e() lässt den Leser denken, dass der Code prüft, ob der Code kein e hat, aber was er tatsächlich tut, zählt das Vorkommen von e.

Putting all dies zusammen, erhalten wir:

def count_letter(word, char='e'): 
    count = 0 
    for c in word: 
     if c == char: 
      count += 1 
    return count 

Einige Tests:

>>> count_letter('tee') 
2 
>>> count_letter('tee', 't') 
1 
>>> count_letter('tee', 'f') 
0 
>>> count_letter('wh' + 'e'*100) 
100 
1

Warum nicht einfach

def has_no_e(word): 
    return sum(1 for letter in word if letter=="e") 
1

Sie müssen nicht eine while-Schleife verwenden. Strings können in Python für for-Schleifen verwendet werden.

def has_no_e(word): 
    count = 0 
    for letter in word: 
     if letter == "e": 
      count += 1 
    print count 

oder etwas einfacher:

def has_no_e(word): 
    return sum(1 for letter in word if letter=="e") 
9
>>> word = 'eeeooooohoooooeee' 
>>> word.count('e') 
6 

Warum nicht?

1

Das Problem ist, dass der letzte Wert von ‚Buchstaben‘ in der Iteration ‚0‘ ist, und wenn dies Sie schauen geschieht bei:

word[letters-1] 

Bedeutung, Sie sehen Wort [-1], die in Python bedeutet "letzter Buchstabe des Wortes".
Sie zählen also korrekt und fügen einen "Bonus" ein, wenn der letzte Buchstabe "e" ist.

1

Es wird zweimal gezählt, wenn es mit einem e endet, weil Sie letters einmal zu viel dekrementieren (weil Sie während letters >= 0 eine Schleife bilden, während Sie letters > 0 durchlaufen sollten). Wenn letters Null erreicht, überprüfen Sie word[letters-1] == word[-1], die dem letzten Zeichen im Wort entspricht.

1

Viele dieser vorgeschlagenen Lösungen funktionieren gut.

Wissen, dass die Liste [-1] in Python das letzte Element der Liste zurückgibt. Wenn Sie also in Ihrem ursprünglichen Code das Wort [letters-1] in einer while-Schleife referenzierten, die durch die Buchstaben> = 0 eingeschränkt wurde, würden Sie das "e" am Ende des Wortes zweimal zählen (einmal bei Buchstaben) war die Länge-1 und ein zweites Mal, wenn Buchstaben 0 war).

Zum Beispiel, wenn mein Wort wie diese „Pete“ Code Spur war aussehen würde (wenn Sie Wort ausgedruckt [Brief] jede Schleife.

e (für Wort [3]) t (für Wort [2]) e (für Wort [1]) P (für Wort [0]) e (für Wort [-1])

Hoffnung hilft diese Dinge zu klären und eine interessante kleine Marotte zu offenbaren über Python.

1

@marcog macht einige ausgezeichnete Punkte;

in der Zwischenzeit können Sie durch Einfügen von print-Anweisungen einfachen Debugging tun -

def has_no_e(word): 
    letters = len(word) 
    count = 0 
    while letters >= 0: 
     ch = word[letters-1]   # what is it looking at? 
     if ch == 'e': 
      count = count + 1 
      print('{0} <-'.format(ch)) 
     else: 
      print('{0}'.format(ch)) 
     letters = letters - 1 
    print count 

dann

has_no_e('tease') 

kehrt

e <- 
s 
a 
e <- 
t 
e <- 
3 

aus denen Sie sehen, dass

  1. Sie in umgekehrter Reihenfolge durch die Zeichenfolge gehen
  2. es korrekt E
  3. Sie sind ‚Umwickeln‘ bis zum Ende des Strings zu erkennen ist - daher der zusätzliche e, wenn die Zeichenfolge endet in einer
1

Wenn das, was Sie wirklich wollen, ist ‚has_no_e‘ dann kann folgendes besser geeignet sein als das Zählen ‚e ist und später dann für null Überprüfung

def has_no_e(word): 
    return 'e' not in word 

>>> has_no_e('Adrian') 
True 
>>> has_no_e('test') 
False 
>>> has_no_e('NYSE') 
True 

Wenn Sie überprüfen wollen, nicht es gibt‘ s entweder E,

def has_no_e(word): 
    return 'e' not in word.lower() 

>>> has_no_e('NYSE') 
False