1. ホーム
  2. python

[解決済み] PythonでStopIterationエラーを回避する方法

2022-02-17 09:04:02

質問

複数のリストから変数を引っ張ってくる行があるのですが、その際に StopIteration エラーが発生し、次の行に進むことができます。今のところbreak関数を使っていますが、これによって StopIteration しかし、リストの最初の項目しか得られず、プリントアウトするとその後に空白行が残ります。

以下は、同じ問題を持つ2つのイテレーションです。

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 ということは、2つのリストに対して同時に反復処理を行いたいようですね。 の一番上の答えを使ってください。 2つのリストを反復して、各反復ごとに各リストから1つの要素を取得する、より良い方法はありますか? (両方のリストの長さが同じであると仮定しています)

はい、イテレータプロトコルは StopIteration (を呼び出した場合、(エラーではなく、反復処理の終了を示す例外が発生するだけです)。 .next() を手動で追加します。Pythonicな使い方は、通常のイテレータとして(例えばループさせるなど)使用することであり、その際に .next() を追加しました。

あなたのコードには、その先にもいくつか問題があるので、見てみるといいでしょう。 http://www.python.org/dev/peps/pep-0008/

例えば '''''' というときに '' で十分です。 代わりに += リストを作成して、最後に結合するのがよいでしょう。 関数から返すだけなら、なぜselfに格納するのかよくわかりません。