引用列表中的下一个项目:Python

7

我正在制作一个变体版本的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个回答

7

我最近也在解决这个问题,提出了以下解决方案(而不是使用range,使用enumerate来获取索引)。

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

这个例子展示了如何访问当前索引、当前项以及列表中的下一项(如果在列表的范围内存在)。


4
以下是一些需要注意的事项,可能会有所帮助:
  1. i = iter(L)item = i.next() 是不必要的。因为在 for item in L 这一行中你立即重新定义了 item,所以它们在此方法中无效。可以尝试注释掉这两行,看看它是否对输出结果产生任何影响。
  2. for item in L 循环结构将遍历列表中的每个项目一次。在此循环内编写的任何代码都将针对列表中的每个项目执行一次。变量 item 是你对迭代过程中列表元素的操作句柄。
  3. 如果在任何迭代过程中,你确实想要访问列表中的“下一个”元素,则考虑使用类似 for i in range(0,len(L)) 的循环结构。然后,L[i] 将是当前项,L[i+1] 将给出下一个项。

在采纳了您和@RMcG的建议后,我成功地将两个单词翻译成中文而没有遇到任何错误。感谢您的帮助。然而,我仍然遇到一些问题,无法使翻译器响应列表中字符串的数量,而不是固定的数字。有什么想法吗?您可以在此处查看完整代码 - Thomas
你在不让for循环完成其遍历整个列表的操作时就问“再次?”。提示:尝试在纸上为一个小例子跟踪计算过程。按照代码的编写方式进行操作(而不是您希望它执行的方式)。这可能会迫使您重新考虑何时放置“再次”逻辑。 - pravnar
搞定了,谢谢。这个技巧很棒。再次感谢你的帮助。 - Thomas

0

步骤如下:

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

    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. 如果您想重复执行函数的操作,只需再次调用它即可,无需重写代码。


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

修改内容:

  • 您不需要将split的返回值强制转换为列表。split的返回类型就是一个列表。
  • 不需要创建迭代器,for循环会自动处理。
  • 我删除了函数作为返回类型。我猜您可能尝试使用递归,但这并非必要。

希望对您有所帮助。


谢谢你的帮助!我能够成功地使用你的建议连续翻译两个单词而没有错误。 - Thomas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接