つくる:カテゴリ自動判定
カテゴリを毎回自分で選ぶのが面倒になる
第 3 章までのおこづかい帳は、言われたことをそのまま整形するだけの道具でした。条件分岐を手に入れたので、ここで一歩進めます。品名を渡すだけでカテゴリを推測する 関数を作ります。
これがあると、記録するたびに「これは食費、これは娯楽」と人間が選ぶ手間がなくなります。作り自体は単純で、品名に決まった言葉が含まれているかを in で調べ、当たったグループのカテゴリ名を返すだけです。
Python
def guess_payment(memo):
if "カード" in memo or "クレカ" in memo:
return "カード"
return "現金"支払い方法を推測する関数です。"カード" in memo は完全一致の == より当てはまる範囲が広く、カードで支払い のような実際の入力にも当たります。候補が増えたら or でつなぎ、グループが増えたら elif で分けます。
どこにも当てはまらなかった行き先を先に決める
上の例の return "現金" は if の外側にあります。どの候補にも当たらなかった記録が、最後にここへ落ちてきます。
この受け皿を忘れて elif だけで終えると、当てはまらない品名を渡したときに return に届かず None が返ります。エラーが出ないので、しばらく気づけません。分岐を書いたら、必ず最後の受け皿を確かめます。
判定の材料は、コードを書き始める前に文章で書き出しておきます。どのグループにどの言葉を入れるかが曖昧なままだと、どこまで書けば完成なのか自分でも分からなくなります。
どの分岐にも入らなかったときの行き先を先に決めておく。これだけで
Noneが返る事故は起きなくなります。
バスタオルは交通費になる
部分一致には弱点があります。バスタオル は日用品ですが バス を含むので、交通費と判定されてしまいます。映画のチケット を娯楽と当てられるのと同じ仕組みが、そのまま誤判定の原因になります。
キーワードの当て方を工夫するか、品名とカテゴリの対応表を持てば改善できます。いま持っている道具で作れる範囲では、この形がいちばん実用的です。限界を知ったうえで使う のと、知らずに使うのとでは大違いです。
in は左が探すもの、右が探される場所です。左右を逆に書くと意味が反転するので、そこだけ確かめてください。
やってみよう
関数 guess_category(name) を実装してください。品名に下記の言葉が含まれていたら、そのカテゴリ名を返します。
- 食費 —
りんご/パン/牛乳 - 日用品 —
ティッシュ/洗剤/歯ブラシ - 娯楽 —
映画/ゲーム/マンガ - 交通費 —
電車/バス/タクシー
どれも含まれないときは "その他" です。判定は == の完全一致ではなく in の部分一致で行います。書けたら りんご 洗剤 映画のチケット 電車代 ノート の 5 つを渡して、5 種類の答えがすべて出ることを確かめてみてください。
要件
- 関数名は guess_category で、引数は name の 1 つ
- name に りんご / パン / 牛乳 のいずれかが含まれるなら "食費" を return する
- name に ティッシュ / 洗剤 / 歯ブラシ のいずれかが含まれるなら "日用品" を return する
- name に 映画 / ゲーム / マンガ のいずれかが含まれるなら "娯楽" を return する
- name に 電車 / バス / タクシー のいずれかが含まれるなら "交通費" を return する
- 上のどれにも当てはまらないときは "その他" を return する
- 判定は == の完全一致ではなく in の部分一致で行う