6

我正在制作 Codecademy 的 pyglatin.py 的变体,以制作一个可以接受和翻译多个单词的翻译器。但是,我在翻译多个单词时遇到了麻烦。我已经能够将原始输入传输到列表中并翻译第一个,但我不知道如何引用列表中的下一个项目。任何帮助将不胜感激。

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()
4

4 回答 4

7

我最近也在研究这个问题,并提出了以下解决方案(而不是使用范围,使用枚举来获取索引)。

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

此示例显示如何访问当前索引、当前项以及列表中的下一项(如果它存在于列表的边界中)。

于 2015-05-22T21:15:06.433 回答
4

以下是一些可能有帮助的注意事项。

  1. 线条i = iter(L)item = i.next()是不必要的。它们在此方法中无效,因为您item随后在该行中重新定义for item in L。继续注释掉这两行,看看它是否对您的输出做出任何改变。
  2. 循环结构for item in L将遍历列表中的每个项目。您在此循环中编写的任何代码都将为列表中的每个项目执行一次。该变量item是您对迭代列表元素的句柄。
  3. 如果在任何迭代过程中,您确实也想访问列表中的“下一个”元素,那么请考虑使用循环结构,例如for i in range(0,len(L)). 然后L[i]将是当前项目,L[i+1]您将给出后续项目。
于 2013-10-19T00:44:11.043 回答
0

一步步:

  1. 如果您以这种方式设置变量 original:

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

    它已经是一个列表,所以需要额外的分配。

  2. 这些行的目的是什么?

    i = iter(L)
    item = i.next()
    
  3. 在循环中,您将变量分配给单词,而实际上它只是单词的第一个字母,所以这样会更好:first = word[0]

  4. 然后,如果你想检查 first 是否是元音,你可以这样做:

    if first in 'aeuoiy'
    
  5. 回答您的实际问题:不要将 L 分配给空列表!

  6. 如果你想重复一个函数的动作,你可以再次调用它,不需要重写代码。

于 2013-10-19T00:38:07.370 回答
0

代码有一些小问题,但我认为它不会重复的主要原因之一。

为了处理整个字符串

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

所做的更改:

  • 您不需要将拆分的返回转换为列表。拆分返回类型是一个列表。
  • 不需要创建迭代器,for 循环会为您执行此操作。
  • 我删除了函数作为返回类型。我假设您正在尝试某种形式的递归,但这并不是绝对必要的。

希望这可以帮助。

于 2013-10-19T09:05:22.403 回答