Ссылка на следующий элемент в списке: python

Я делаю вариацию pyglatin.py Codecademy, чтобы сделать переводчика, который принимает и переводит несколько слов. Однако у меня возникли проблемы с переводом более одного слова. Я смог перенести исходный ввод в список и перенести первый, но я не знаю, как ссылаться на следующий элемент в списке. Любая помощь будет принята с благодарностью.

def piglatin1(): pig = 'ay' original = raw_input('Enter a phrase:').split(' ') L = list(original) print L i = iter(L) item = i.next() for item in L: if len(item) > 0 and item.isalpha(): word = item.lower() first = word if first == "a" or first == "e" or first == "i" or first == "o" or first =="u": new_word = word + pig print new_word else: new_word = word[1:] + word[0:1] + pig # first word translated L = [] M = L[:] L.append(new_word) print L # secondary list created. again = raw_input('Translate again? Y/N') print again if len(again) > 0 and again.isalpha(): second_word = again.lower() if second_word == "y": return piglatin() else: print "Okay Dokey!" else: print 'Letters only please!' return piglatin1() 

Вот несколько замечаний, которые могут помочь.

  1. Строки i = iter(L) и item = i.next() не нужны. Они не влияют на этот метод, потому что вы переопределяете item сразу после этого в строке for item in L Продолжайте и прокомментируйте эти две строки, чтобы узнать, не вносят ли какие-либо изменения в ваш результат.
  2. Конструкция цикла for item in L будет проходить один раз над каждым элементом в списке. Независимо от того, какой код вы пишете в этом цикле, будет выполняться один раз для каждого элемента в списке. Элемент переменной – это ваш дескриптор элемента списка итерации.
  3. Если во время любой итерации вы действительно хотите получить доступ к «следующему» элементу в списке, а затем рассмотрите использование цикла, например, for i in range(0,len(L)) . Тогда L[i] будет текущим, а L[i+1] вы передадите последующий элемент.

Недавно я работал над этой проблемой и придумал следующее решение (вместо использования диапазона, используйте перечисление для получения индекса).

 for index, item in enumerate(L): next = index + 1 if next < len(L): print index, item, next 

В этом примере показано, как получить доступ к текущему индексу, текущему элементу, а затем к следующему элементу в списке (если он существует в границах списка).

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

Чтобы обработать всю строку,

 again = raw_input('Translate again? Y/N') 

и его последующие строки должны быть выведены за рамки заявления for. Также вы устанавливаете L в пустую строку внутри цикла:

 L = [] 

Ниже приведена модифицированная версия вашего кода, которая будет охватывать все предложение, а затем запрашивать другое.

 def piglatin(): pig = 'ay' while True: L = raw_input('Enter a phrase:').split(' ') M = [] for item in L: if len(item) > 0 and item.isalpha(): word = item.lower() first = word if first == "a" or first == "e" or first == "i" or first == "o" or first =="u": new_word = word + pig print new_word else: new_word = word[1:] + word[0:1] + pig M.append(new_word) else: print 'Letters only please!' print M # secondary list created. again = raw_input('Translate again? Y/N') print again if len(again) > 0 and again.isalpha(): second_word = again.lower() if second_word == "n": print "Okay Dokey!" break 

Сделанные изменения:

  • Вам не нужно возвращать раскол в список. Тип возврата split – это список.
  • Нет необходимости делать итератор, цикл for сделает это за вас.
  • Я удалил функцию как возвращаемый тип. Я предполагаю, что вы пытались найти какую-то форму рекурсии, но это не обязательно.

Надеюсь это поможет.

Шаг за шагом:

  1. Если вы установите переменную оригинала таким образом:

     original = raw_input('Enter a phrase:').split() 

    он будет уже списком, поэтому потребуется дополнительное назначение.

  2. Какова цель этих строк?

     i = iter(L) item = i.next() 
  3. В цикле вы назначаете переменную для слова, когда она на самом деле является только первой буквой слова, поэтому будет лучше: first = word[0]

  4. Затем, если вы хотите проверить, является ли сначала гласным, вы можете просто сделать:

     if first in 'aeuoiy' 
  5. Ответьте на свой вопрос: не назначайте L в пустой список!

  6. Если вы хотите повторить действие функции, вы можете просто вызвать ее снова, не нужно переписывать код.