Python学習編19回目です。
前々回からは東京大学のPython学習ページの2周目をやっています。今回は3-2. 繰り返し(2周目)(前半)。
強くてニューゲームのはずなのに
英語の文章からなる文字列 str_engsentence
が引数として与えられたとき、 str_engsentence
中に含まれる3文字以上の全ての英単語を要素とするリストを返す関数 collect_engwords
を作成してください。ただし、同じ単語を重複して含んでいて構いません。
collect_engwords(‘Unfortunately no, it requires something with a little more kick, plutonium.’)
で詰まった。まず、英文を単語に分解するときに’,’ や’.’といった記号の処理に困り、最初はこれらの記号をリストにしようとして型エラーを起こしたので、一旦’,’ や’.’を’ ‘に変換してからsplitで英文を単語のリストにした(ここでsplitをspritにタイポして詰まった。日本人はrとlが区別できない)。次に単語のリストから3文字未満のものを除く段階で、最初for文でリストの3文字未満の要素をpopで消す記述にしたら、out of rangeエラーが出て、この理由がわからずChatGPTに聞いてもわからず、読み返してわかった。
ChatGPT:out of range
のエラーが発生する主な理由は、ループの実行中にリスト answer
のサイズを変更しているためです。リストから要素を .pop(j)
で削除すると、リストの長さが減少しますが、for j in range(len(answer)):
で設定された範囲はループの開始時に決定され、その後は変更されません。これにより、リストの最後の部分でインデックス j
が実際のリストの長さを超える可能性があり、その結果 out of range
エラーが発生します。
長さ10のリストでfor i in range(len(リスト))をとると、リストの0~9番地を走査するけど、ここで1番地の「No」をpopで消すとリストの長さが9(0~8)となり、9番地を探したときに範囲外になってエラーを吐いた。
なんで「単語のリストから3文字未満のものを除く」を逆に考えて、「空のリストに3文字以上の単語を追加する」ようにしてやっと正解にたどり着いた。「リストからnを取り除く→からのリストを用意してn以外の要素をそこに足していく」と読み替えるのは汎用性が高そうだ。
次回に続く