Считать буквы в слове в отладке python

Я пытаюсь подсчитать количество раз, когда «e» появляется одним словом.

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 

Кажется, что это нормально, если только слово не заканчивается «e». Он будет считать это «е» дважды. Понятия не имею почему. Любая помощь?

Я знаю, что мой код может быть неаккуратным, я новичок! Я просто пытаюсь понять логику того, что происходит.

    Как упоминают другие, вы можете реализовать тест простым word.count('e') . Если вы не делаете это как простое упражнение, это намного лучше, чем пытаться изобрести колесо.

    Проблема с вашим кодом заключается в том, что он считает последний символ дважды, потому что вы тестируете индекс -1 в конце, который в Python возвращает последний символ в строке. Исправьте его, изменив while letters >= 0 до while letters > 0 .

    Существуют и другие способы, которыми вы можете убрать ваш код (при условии, что это упражнение в обучении):

    • Python обеспечивает хороший способ итерации по строке с использованием цикла for . Это гораздо более сжато и легче читать, чем использование цикла while и поддержка собственной переменной счетчика. Как вы уже видели здесь, добавление сложности приводит к ошибкам. Будь проще.
    • Большинство языков предоставляют оператор += , который для целых чисел добавляет сумму к переменной. Это более кратким, чем count = count + 1 .
    • Используйте параметр, чтобы определить, какой символ вы рассчитываете, чтобы сделать его более гибким. Определите аргумент по умолчанию для использования char='e' в списке параметров, когда у вас есть очевидное значение по умолчанию.
    • Выберите более подходящее имя для функции. Имя has_no_e() заставляет читателя думать, что код проверяет, не содержит ли код e, но то, что он на самом деле делает, подсчитывает вхождения e.

    Объединяя все это, мы получаем:

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

    Некоторые тесты:

     >>> count_letter('tee') 2 >>> count_letter('tee', 't') 1 >>> count_letter('tee', 'f') 0 >>> count_letter('wh' + 'e'*100) 100 
     >>> word = 'eeeooooohoooooeee' >>> word.count('e') 6 

    Почему не это?

    Почему бы просто не

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

    Проблема в том, что последнее значение «букв» в вашей итерации равно «0», и когда это происходит, вы смотрите:

      word[letters-1] 

    смысл, вы смотрите на слово [-1], которое в python означает «последняя буква слова».
    так что вы на самом деле правильно подсчитываете и добавляете «бонус», если последняя буква «e».

    Он будет считать это дважды, когда заканчивается на e, потому что вы уменьшаете letters один раз слишком много (потому что вы петли, а letters >= 0 и вы должны быть петлями, а letters > 0 ). Когда letters достигают нуля, вы проверяете word[letters-1] == word[-1] которое соответствует последнему символу в слове.

    Многие из предложенных решений будут работать нормально.

    Знайте, что в Python список [-1] вернет последний элемент списка.

    Итак, в вашем исходном коде, когда вы ссылались на слово [буквы-1] в цикле while, ограниченном буквами> = 0, вы считали бы «e» в конце слова дважды (один раз, когда буквы были длиной – 1 и второй раз, когда буквы были 0).

    Например, если бы мое слово было «Пит», ваш код будет выглядеть так (если вы напечатали слово [письмо] каждый цикл.

    e (для слова [3]) t (для слова [2]) e (для слова [1]) P (для слова [0]) e (для слова [-1]))

    Надеюсь, это поможет прояснить ситуацию и выявить интересную небольшую причуду о Python.

    @marcog делает отличные очки;

    в то же время вы можете выполнить простую отладку, вставив инструкции печати –

     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 

    тогда

     has_no_e('tease') 

    возвращается

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

    из которого вы можете видеть, что

    1. вы проходите строку в обратном порядке
    2. он правильно распознает e
    3. вы «обертываете» до конца строки – следовательно, дополнительный e, если ваша строка заканчивается на одном

    Если то, что вы действительно хотите, это «has_no_e», тогда следующее может быть более подходящим, чем подсчет «e», а затем более поздняя проверка на нуль,

     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 

    Если вы хотите проверить, нет ли «E»,

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

    Вам не нужно использовать цикл while. Строки могут использоваться для циклов в Python.

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

    или что-то более простое:

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