【问题标题】:Reference next item in list: python参考列表中的下一项:python
【发布时间】:2013-10-18 23:04:05
【问题描述】:

我正在制作 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()

【问题讨论】:

    标签: python list reference


    【解决方案1】:

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

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

    这个例子展示了如何访问当前索引、当前项,然后是列表中的下一项(如果它存在于列表的边界内)。

    【讨论】:

      【解决方案2】:

      这里有一些注意事项可能会有所帮助。

      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 的建议,我能够成功地连续翻译两个单词而不会遇到任何错误。感谢您的帮助。但是,在让翻译器响应列表中的字符串数量而不是一组数字时,我仍然遇到了一些麻烦。有任何想法吗?您可以查看full code here.
      • 你在问“再次?”不让 for 循环完成它的工作——即遍历整个列表。提示:尝试按照纸上的计算作为一个小例子。完全按照编写的代码进行操作(而不是您希望它的行为)。这可能会迫使您重新考虑将“再次”逻辑放在哪里。
      • 解决了,谢谢。技术也很棒。再次感谢您的帮助。
      【解决方案3】:

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

      为了处理整个字符串

      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 循环会为您完成。
      • 我删除了函数作为返回类型。我假设您正在尝试某种形式的递归,但这并不是绝对必要的。

      希望这会有所帮助。

      【讨论】:

      • 感谢您的帮助!根据您的建议,我成功地连续翻译了两个单词。
      • 很高兴我能帮上忙。快乐编码:D
      【解决方案4】:

      一步一步:

      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. 如果要重复某个函数的动作,只需再次调用即可,无需重写代码。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-09-25
        • 1970-01-01
        • 1970-01-01
        • 2018-12-26
        • 2021-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多