2015-01-26 4 views
-1

я делал Pig Latin переводчик в питона (со всеми определенными правилами), а вот мой код:Python ошибка: «Индекс строки из диапазона»

print ("Enter some text here to be translated to Pig Latin: "); 
text = input("> "); 

wordlist = []; 
letterlist = []; 

for word in text: 
    if word[0] != "a" and word[0] != "e" and word[0] != "i" and word[0] != "o" and word[0] != "u": 
     if word[1] == "a" or word[1] == "e" or word[1] == "i" or word[1] == "o" or word[1] == "u": 
      for number in range(1, len(word) - 1): 
       letterlist.append(word[number]); 
      letterlist.append(word[0]); 
      letterlist.append("ay"); 
      new_word = "".join(letterlist); 
      wordlist.append(new_word); 
      letterlist = []; 
     else: 
      for number in range(2, len(word) - 2): 
       letterlist.append(word[number]); 
      letterlist.append(word[0]); 
      letterlist.append(word[1]); 
      letterlist.append("ay"); 
      new_word = "".join(letterlist); 
      wordlist.append(new_word); 
      letterlist = []; 
    else: 
     letterlist.append(word); 
     letterlist.append("way"); 
     new_word = "".join(letterlist); 
     wordlist.append(new_word); 
     letterlist = []; 

pigLatin = " ".join(wordlist); 
print (pigLatin); 

Я получаю сообщение об ошибке, указывая в сторону линии :

if word[1] == "a" or word[1] == "e" or word[1] == "i" or word[1] == "o" or word[1] == "u": 

, говорящий, что индекс строки находится за пределами допустимого диапазона. Пожалуйста помоги!

+3

Если вы введете однобуквенное слово, что будет 'word [1]' be? – jwodder

+0

Как вы можете вложить два условия комплимента внутри друг в друга? – ZdaR

+1

@jwodder Забудьте о вводе 1 буквы, строка 'для слова в тексте:' извлекает 1 символ из строки 'text'. Так что это ошибка для ввода нескольких букв –

ответ

1

пара вопросов здесь. Я структурирую свой ответ, добавив #comments к вашему коду.

Как правило, вы должны сначала разделить входные данные от строки символов на список «слов» (группы символов, не содержащие пробелов). кроме того, перед тем, как вы проверите значение слова [1], вы должны добавить блок, например if len(word) < 2:; continue, чтобы вы правильно обрабатывали представления, длина которых составляет всего один символ (например, буква «a»).

print ("Enter some text here to be translated to Pig Latin: "); 
text = input("> "); 

wordlist = []; 
letterlist = []; 

for word in text: # how do you know that text will be separated into words? 
# as of right now, text is a string of characters, not a list of words. you 
# should use something like words = text.split(), and then iterate over words. 
# .split() converts a string into a list of strings. by default it separates 
# according to the whitespace between characters. 
    if word[0] != "a" and word[0] != "e" and word[0] != "i" and word[0] != "o" and word[0] != "u": 
     if word[1] == "a" or word[1] == "e" or word[1] == "i" or word[1] == "o" or word[1] == "u": 
# here's the problem referenced in your question. 
# since text is a string of characters, when you iterate over it with `for`, 
# you will be looking at one character at a time. each character has only one 
# index, 0. for example 'e'[0] will return 'e', but 'e'[1] will throw an error, 
# since there is no index 1. 

      for number in range(1, len(word) - 1): 
       letterlist.append(word[number]); 
      letterlist.append(word[0]); 
      letterlist.append("ay"); 
      new_word = "".join(letterlist); 
      wordlist.append(new_word); 
      letterlist = []; 
     else: 
      for number in range(2, len(word) - 2): 
       letterlist.append(word[number]); 
      letterlist.append(word[0]); 
      letterlist.append(word[1]); 
      letterlist.append("ay"); 
      new_word = "".join(letterlist); 
      wordlist.append(new_word); 
      letterlist = []; 
    else: 
     letterlist.append(word); 
     letterlist.append("way"); 
     new_word = "".join(letterlist); 
     wordlist.append(new_word); 
     letterlist = []; 

pigLatin = " ".join(wordlist); 
print (pigLatin); 
Смежные вопросы