CONTENTS コンテンツ

ChatGPTを使ってPythonを学ぼう!(19)

ChatGPTを使ってPythonを学ぼう!

2024.02.17

 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以外の要素をそこに足していく」と読み替えるのは汎用性が高そうだ。

次回に続く

この記事をシェアする