2013-11-20 5 views
2

Мне 15 лет, и сейчас я занимаюсь GCSE в Computing. Мои знания очень просты, и у меня были некоторые проблемы с куском кода, который я должен написать для «Vowel Worth Calculator», который должен проверять слово и давать ему оценку гласных в зависимости от того, сколько и какие гласные. Я продолжаю ошибаться, и я полностью в тупике, любая помощь будет оценена. Вот мой исходный код:Python 'String Index Out of Range Error'?

Vowel Worth Счетчик

print('Welcome to the Vowel Worth Counter!') 

word = input('Please input your word, in lower-case, or type Q to quit.') 

if word == 'Q' : 
    quit() 

def vowelcount(word) : 
    lettercount = int(len(word)) 
    vowelscore = 0 
    checkcount = 1 
    position = 0 
    while lettercount != checkcount : 
     if word[position] == str('a') : 
      vowelscore = vowelscore + 5 
     if word[position] == str('e') : 
      vowelscore = vowelscore + 4 
     if word[position] == str('i') : 
      vowelscore = vowelscore + 5 
     if word[position] == str('o') : 
      vowelscore = vowelscore + 5 
     if word[position] == str('u') : 
      vowelscore = vowelscore + 5 
     position = position + 1 
    if lettercount == checkcount : 
     print('I have finished calculatiing your Vowel Score.') 
     print('Your Vowel score is ' + str(vowelscore) + '!') 
     for x in range (0,1) : 
      break 
vowelcount(word) 

Как я уже говорил, любая помощь будет признателен, спасибо.

+1

Вы никогда не меняете 'checkcount', поэтому цикл' while' никогда не может закончиться. –

+0

'while lettercount! = Checkcount'. Вы никогда не изменяете ни один из ваших циклов while, пока вы все еще увеличиваете «позицию». Вот почему вы код умирает – inspectorG4dget

+0

Кроме того, в Python гораздо более обычным является цитировать непосредственно над структурами данных, такими как списки или строки, чем использовать индекс. 'для буквы в слове:' будет питоновой идиомой, по крайней мере, если бы я не собирался использовать более продвинутые конструкции. –

ответ

3

Выход contidion в цикле должен быть:

while position < lettercount: 

Или еще проще, вы можете перебрать каждый символ в строке, как это:

for c in word: 
    if c == 'a': 
     # and so on 
2

Это может быть более вещим использовать dictionary data structure

vowels = { 'a' : 5, 'e' : 4, 'i' : 5, 'o' : 5, 'u' : 5} 

vowelscore = 0 

for letter in word: 
    if letter in vowels: 
     vowelscore += vowels[letter] 
+0

Ха-ха! Я написал тот же самый код, но сопротивлялся, отвечая на вопрос, потому что я думал, что это слишком дерзко. Кроме того, он не ответил на вопрос, заданный OP: «Почему его код не работает?». Так или иначе! :) – tMJ

+1

Да. Я понял, что @ ÓscarLópez уже ответил на OP, я полагал, что предлагаю взглянуть на структуру данных, которую он/она может не встретить раньше :). Это смешно, хотя –

+1

ОК, так как мы попадаем в альтернативные конструкции - определяем dict так, как указано выше, тогда 'vowelscore = sum (vowels.get (letter, 0) для буквы в слове)' –