オブジェクトと内包表記
このレッスンでは、第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]さらに絞り込みたいときはインスタンスのまま渡し、画面に出したり合計したりするときは属性や数値に変換する、と使い分けます。処理の途中はインスタンス、最後は文字列や数値、と覚えておくと迷いません。
要件
- 内包表記で rows を Expense のリストに変換すること
- 内包表記で price が limit 以上のものだけを残すこと
- 戻り値は品名の文字列を並べたリストにすること
- 元の並び順を変えないこと
入出力例
expensive_names([["牛乳",158,"食費"],["書籍",1600,"教養"],["電車代",420,"交通費"]], 500) → ["書籍"]
expensive_names([["牛乳",158,"食費"],["書籍",1600,"教養"],["電車代",420,"交通費"]], 158) → ["牛乳","書籍","電車代"]ヒント
編集 LuaGate編集部