2013-06-26 64 views
4

StopIteration異常錯誤我有一個變量從多個列表拉一條線,我想它避免出現這樣它可以移動到下一行的StopIteration錯誤。此刻,我正在使用中斷功能,這樣可以避免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()?

+1

你爲什麼要調用self.pointer_list.next()並傳入一個pointer_list? – doctorlove

+0

對不起,錯字!反正沒有區別! – Johnnerz

+2

這裏沒有必要三重引用任何東西;你不包括換行符和引用過於冗長。更好的是,使用字符串格式:'http://www.example.org/lexicon# {} http://www.monnetproject.eu/lemon#has_ptr{}\n'.format(synset_offset,pointer_list.next( ))'。 –

回答

3

在compose_line5,而不是pointer_list.next(),使用項目 - 你已經遍歷pointer_list。

對於compose_line6,看來你想同時遍歷兩個列表。使用來自Is there a better way to iterate over two lists, getting one element from each list for each iteration? 頂端回答(我假定這兩個列表的長度相同)

是,迭代器協議將拋出StopIteration異常(不是錯誤,只是一個異常信號迭代結束),如果你打電話。下一步()手動。 pythonic使用它的方式是將其用作普通的迭代器(例如,循環它),而不是調用.next()。

您的代碼已經超越那幾個問題,你可能想看看 - 看看http://www.python.org/dev/peps/pep-0008/

例如,沒有必要使用「」「」「」就足夠了「何時」。不要做+ =,你可能想創建一個列表,然後加入最後。不知道如果你只是從函數中返回它們,你爲什麼要存儲自己的東西。

+0

好,在synset_list爲LINE5工作,但對於LINE6,我只是用'對項目:'循環爲倍量,兩個列表我使用是一樣的長度 編輯:剛纔看到您的編輯那裏,謝謝!! – Johnnerz

+0

您的6代碼示例同時使用pointer_list和synset_list。如果你實際上不需要在synset_list中使用任何東西,那麼爲什麼不循環使用pointer_list呢? –

+0

對不起,我說錯了 – Johnnerz