2010-12-30 2 views
3

Я пытаюсь подсчитать количество раз «e» появляется в слове.Подсчитайте буквы в слове в 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 

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

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

+0

Когда буквы == 0, что произойдет? Почему вы тестируете 'while letters> = 0'? Можете ли вы объяснить, почему ** вы это делаете? Объяснение было бы полезно. –

ответ

9

Как отмечают другие, вы можете осуществить проверку с помощью простого 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 
1

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

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

Вы не должны использовать 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") 
9
>>> word = 'eeeooooohoooooeee' 
>>> word.count('e') 
6 

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

1

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

word[letters-1] 

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

1

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

1

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

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

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

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

е (для слова [3]) т (для слова [2]) х (для слова [1]) P (для слова [0]) х (для слова [-1])

Надеется, что это помогает очистить вещи и выявить интересную маленькую причуду о Python.

1

@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. это правильно признанием Э
  3. вы «обертки вокруг» до конца строки - отсюда и дополнительных е, если ваша строка заканчивается в одной
1

Если то, что вы действительно хотите «has_no_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 
Смежные вопросы