欲しい機能は自分で作る。

文字列の中からお目当ての文字の位置を取得するメソッドとして、find()とindex()がある。

>>> "kakinotane".find("tane")
6
>>> "kakinotane".index("tane")
6

find()は探しているものが含まれていないと-1を返し、index()はValueErrorになるが、その違いだけでなぜ二つ必要なのだろう?
融通の利かない神経質な奴とは付き合いたくないので、find()を使っているが、探す場所が文字列ではなくリストの場合、なぜかfind()メソッドは使えない。
なんでそういう変則的なルールにするかな(怒)
独学だとこういった取るに足らない素朴な疑問や悩みが未解決のまま山積みになっていく。

必ずそこに含まれていると判っている場合にしか使えないという制約は、端的に言って不便だと思うんだが。たとえばリストの頭からターゲットを探し、見つけては次のターゲットへ、尽きるまで繰り返したいといったケースは結構あるのに。
エラーを返すという仕様のほうが便利な、諸事情があるのかもしれんが、僕はまだそれを理解できる大人に達していない。

エラーを起こさずindex()を使いたい場合は、対象が含まれていることを事前確認してからindex()を実行する。二度手間なことをやっている感じだが、電話をかける前にまずその在席確認メールを打ってしまうような気配り日本人ならフツーの感覚なのかも。
そんな時は自分で関数を作って用意しておくといい、と教わった。
何度も使いそうなのでメモしておこう。

def smart_index(listname, i, n):
   return listname.index(i, n) if i in listname[n:] else -1
listname : このリスト内を探す
i : 探し出したい要素
n : リストの n 番目以降に限定して探す
リストになかったら -1を返す

これならコードが煩雑にならずに済みそうだ。

この記事が気に入ったらサポートをしてみませんか?