オブジェクトと内包表記

このレッスンでは、第3章で覚えた内包表記をオブジェクトのリストに使い、条件に合う支出だけを取り出せるようになります。

クラスと内包表記を組み合わせる

第3章では辞書のリストから条件に合うものを取り出しました。取り出す対象がインスタンスに変わっても、書き方はほとんど同じです。違いは、row["price"] と添字で読んでいたところが expense.price とドットになることだけです。

expenses = [ Expense("牛乳", 158, "食費"), Expense("書籍", 1600, "教養"), ] names = [expense.name for expense in expenses if expense.price >= 500] print(names) # ['書籍']

for expense in expenses で1件ずつ取り出し、if で残すものを選び、左端の式で取り出す値を決めます。ここでは名前だけを取り出しているので、結果は文字列のリストになります。

生のデータからインスタンスの列を作る

CSV や JSON から読んだデータは、リストや辞書の形で手元に来ます。これを内包表記でまとめて Expense に変換しておくと、以降の処理はすべて属性で書けるようになります。

rows = [["牛乳", 158, "食費"], ["書籍", 1600, "教養"]] expenses = [Expense(name, price, category) for name, price, category in rows]

for name, price, category in rows は、第2章で覚えたアンパックです。内包表記の中でもそのまま使えます。

属性を返すか、インスタンスを返すか

左端の式を expense にすれば、条件に合ったインスタンスそのもののリストが得られます。

high = [expense for expense in expenses if expense.price >= 500]

さらに絞り込みたいときはインスタンスのまま渡し、画面に出したり合計したりするときは属性や数値に変換する、と使い分けます。処理の途中はインスタンス、最後は文字列や数値、と覚えておくと迷いません。

要件

  1. 内包表記で rows を Expense のリストに変換すること
  2. 内包表記で price が limit 以上のものだけを残すこと
  3. 戻り値は品名の文字列を並べたリストにすること
  4. 元の並び順を変えないこと

入出力例

expensive_names([["牛乳",158,"食費"],["書籍",1600,"教養"],["電車代",420,"交通費"]], 500)["書籍"] expensive_names([["牛乳",158,"食費"],["書籍",1600,"教養"],["電車代",420,"交通費"]], 158)["牛乳","書籍","電車代"]

ヒント

生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア
編集 LuaGate編集部
main.py
学習モード

メモ

オブジェクトと内包表記

⌘S で保存