我有一行从多个列表中提取变量,我希望它避免出现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()的每种方法中捕获异常?

最佳答案

compose_line5中,请使用pointer_list.next()而不是item-您已经在pointer_list上进行迭代。

对于compose_line6,似乎您想同时遍历两个列表。使用Is there a better way to iterate over two lists, getting one element from each list for each iteration?的最高答案
(我假设两个列表的长度相同)

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

您的代码还有一些您可能不希望看到的问题-查看http://www.python.org/dev/peps/pep-0008/

例如,当''''''足够时,无需使用''。除了执行+=之外,您可能还想创建一个列表,然后最后加入。如果只是从函数中返回它们,则不确定为什么要自己存储它们。

关于python - 如何避免python中的StopIteration错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17317900/

10-09 18:50