2017-02-08 2 views
0

Извините, если я действительно неосведомлен, я начал изучать код Python недавно (первый язык) и работал над этой задачей на codewars.com, чтобы создать одну латинскую программу с одним словом. Это довольно грязно, но, похоже, работает, кроме того, что сообщение:IndexError: индекс строки за пределами диапазона. Pig Latin

Traceback: 
    in 
    in pig_latin 
IndexError: string index out of range 

... появляется. Я посмотрел онлайн, и я вроде как собираюсь, вероятно, какой-то фрагмент кода, который просто выходит из строя, или мне нужно -1 где-то или что-то в этом роде. Мне было интересно, сможет ли кто-нибудь помочь мне определить, где это будет. Это не помогло, конечно, тот факт, что я сделал это трудно для себя с моей неэффективностью: P благодаря

def pig_latin(s): 
    word = 'ay' 
    word2 = 'way' 
    total=0 
    total2=0 
    lst = [] 
    val = None 

    #rejecting non character strings 
    for c in s: 
     if c.isalpha() == False: 
      return None 

    #code for no vowels and also code for all consonant strings 
    for char in s: 
     if char in 'aeiou': 
      total+=1 
      if total==0: 
       return s + 'ay' 
      else: 
       pass 
     elif char not in 'aeiou': 
      total2+=1 
      if total2 == len(s): 
       answer_for_cons = s + word 
       return answer_for_cons.lower() 

    #first character is a vowel 
    if s[0] in 'aeiou': 
     return s + word2 

    #normal rule 
    elif s[0] not in 'aeiou': 
     for c in s: 
      if c in 'aeiou': 
       lst.append(s.index(c)) 
       lst.sort() 
       answer = s[lst[0]:len(s)] + str(s[:lst[0]]) + word 
       return answer.lower() 

ответ

0

Единственная точка, где индекс замешана когда вы звоните s[0]. Возможно, вы попробовали запустить pig_latin с пустой строкой?

Кроме того, форматирование кода не имеет смысла. Я предполагаю, что он потерялся в склеивании? Все ниже val = None должно быть как минимум одним отступом справа.

0

Теперь, когда отступы фиксируется код, кажется, бежит, но это действительно поднимает

IndexError: string index out of range 

если мы пройдем pig_latin пустая строка. Это из-за

if s[0] in 'aeiou': 

Это не сработает, если s пустая строка, потому что вы не можете сделать s[0] на пустой строке. s[0] относится к первому символу в строке, но пустая строка не имеет первого символа. И, конечно, pig_latin возвращает None, если мы передадим ему строку, содержащую не-альфа-символы.

Итак, прежде чем вы начнете выполнять другие тесты, вы должны проверить, что строка не пуста, и вернуть что-то подходящее, если оно пустое. Самый простой способ сделать это

if not s: 
    return '' 

Я предлагаю возвращение s или пустая строка, если вы прошли неверную строку, а не возвращать None. Функция, которая возвращает разные типы в зависимости от значения ввода, немного беспорядочна для работы.


Существуют различные упрощения и улучшения, которые могут быть внесены в ваш код. Например, нет необходимости делать elif char not in 'aeiou' после того, как вы уже сделали if char in 'aeiou', так как если char in 'aeiou' ошибочно, то char not in 'aeiou'обязательно должно быть. Однако мы можем просто полностью выделить этот раздел.

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

def pig_latin(s): 
    word = 'ay' 
    word2 = 'way' 

    #return empty and strings that contain non-alpha chars unchanged 
    if not s or not s.isalpha(): 
     return s 

    #code for no vowels 
    total = 0 
    for char in s: 
     if char in 'aeiou': 
      total += 1 

    if total == 0: 
     return s.lower() + word 

    #first character is a vowel 
    if s[0] in 'aeiou': 
     return s.lower() + word2 

    #normal rule. This will always return before the end of the loop 
    # because by this point `s` is guaranteed to contain at least one vowel 
    for i, char in enumerate(s): 
     if char in 'aeiou': 
      answer = s[i:] + s[:i] + word 
      return answer.lower() 

# test 

data = 'this is a pig latin test string aeiou bcdf 123' 
s = ' '.join([pig_latin(w) for w in data.split()]) 
print(s) 

выход

isthay isway away igpay atinlay esttay ingstray aeiouway bcdfay 123 
+0

Спасибо за помощь, что, похоже, избавились от сообщения об ошибке.В настоящее время у меня нет базового теста, в котором говорится, что «yaay» должен равняться «ayay». Я думал, что тесты прошли гладко, любая идея, о чем идет речь? –

+0

@BillUrquhart Хмм. Я не изменил ни одну из основных логических манипуляций с текстом из вашей версии. Я предполагаю, что должно быть дополнительное правило для обработки слов, начинающихся с 'ya' (или что-то в этом роде). У вас есть ссылка на правила, которые должен реализовать ваш код? –

+0

Извинения, я прокомментировал перед тем, как увидеть вашу измененную версию. Позвольте мне реализовать ваши и отложить назад –

Смежные вопросы