14

我有一行从多个列表中提取变量,我希望它避免出现StopIteration错误,以便它可以移动到下一行。目前我正在使用 break 功能,这避免了StopIteration, 但只给了我列表中的第一项,如果我要打印出来,它会在它之后留下一个空行。

这是我的两个具有相同问题的迭代。

def compose_line5(self, synset_offset, pointer_list):
    self.line5 = ''''''
    for item in pointer_list:
        self.line5 += '''http://www.example.org/lexicon#'''+synset_offset+''' http://www.monnetproject.eu/lemon#has_ptr '''+pointer_list.next()+'''\n'''            
        break
    return self.line5

def compose_line6(self, pointer_list, synset_list): 
    self.line6 = ''''''
    for item in synset_list:
        self.line6 += '''http://www.example.org/lexicon#'''+pointer_list.next()+''' http://www.monnetproject.eu/lemon#pos '''+synset_list.next()+'''\n'''                      
        break
    return self.line6

这是我在没有休息的情况下得到的错误:

Traceback (most recent call last):
  File "wordnet.py", line 225, in <module>
    wordnet.line_for_loop(my_file)
  File "wordnet.py", line 62, in line_for_loop
    self.compose_line5(self.synset_offset, self.pointer_list)
  File "wordnet.py", line 186, in compose_line5
    self.line5 += '''http://www.example.org/lexicon#'''+self.synset_offset+''' http://www.monnetproject.eu/lemon#has_ptr '''+self.pointer_list.next()+'''\n'''
StopIteration

是否有一个快速解决方案,或者我是否必须为我使用 iter() 的每个方法捕获异常?

4

1 回答 1

10

compose_line5,而不是pointer_list.next(),使用item- 你已经迭代了pointer_list

对于compose_line6,您似乎想同时遍历两个列表。使用来自是否有更好的方法来迭代两个列表的最佳答案,每次迭代从每个列表中获取一个元素? (我假设两个列表的长度相同)

是的,如果您手动调用迭代器协议,它将引发StopIteration(不是错误,只是表示迭代结束的异常) 。.next()使用它的 Pythonic 方式是将它用作普通的迭代器(例如,循环它)而不是调用.next()它。

除了您可能想要查看的代码之外,您的代码还有一些问题 - 查看http://www.python.org/dev/peps/pep-0008/

例如,不需要''''''''足够时使用。而不是这样做+=,您可能想要创建一个列表然后最后加入。如果您只是从函数中返回它们,不确定为什么要将它们存储在 self 中。

于 2013-06-26T10:47:59.953 回答