辞書内包表記
このレッスンでできるようになること。辞書内包表記を使って、カテゴリから合計金額への辞書を1行で作れるようになります。
第2章では defaultdict でカテゴリごとに支出をまとめました。まとめ終わったデータは、カテゴリ名をキー、支出のリストを値とする辞書になっています。
grouped = {
"食費": [{"name": "スーパー", "amount": 3200}, {"name": "コンビニ", "amount": 620}],
"交通費": [{"name": "電車代", "amount": 480}],
}ここから「カテゴリごとの合計」を出したいとき、これまでは空の辞書を用意して for でまわし、キーごとに合計を代入していました。辞書内包表記を使うと、この形をそのまま1行で書けます。
totals = {cat: sum([e["amount"] for e in items]) for cat, items in grouped.items()}リスト内包表記との違いは2つあります。角かっこではなく波かっこで囲むこと、そして左側に「キー」と「値」を書くことです。キーと値の区切りには辞書と同じ記号を使います。この2つがそろっているものだけが辞書内包表記で、キーだけを書くと別のものになります。それは次のレッスンで扱います。
もとが辞書のときは .items() を付けて、キーと値を同時に受け取るのが定番です。キーだけでよければ for cat in grouped と書けますが、値も使う今回のような集計では items を使ったほうが短くなります。
上の例では、合計を出す部分にリスト内包表記が入れ子で入っています。内包表記の中に内包表記を書けるのが Python の強みですが、3段になると急に読めなくなります。2段までにとどめ、それ以上になりそうなら途中結果を変数に置いてください。
末尾に if を付けて対象を絞れる点はリストと同じです。たとえば if items と書けば、支出が1件も無いカテゴリを結果から外せます。
要件
- 波かっこを使った辞書内包表記で書くこと
- もとの辞書のキーをそのまま結果のキーにすること
- 値は そのカテゴリの amount の合計 とすること
入出力例
total_by_category({"交通費":[{"amount":480,"name":"電車代"}],"食費":[{"amount":3200,"name":"スーパー"},{"amount":620,"name":"コンビニ"}]}) → {"交通費":480,"食費":3820}
total_by_category({"教養費":[{"amount":2800,"name":"書籍"},{"amount":9800,"name":"講座"}]}) → {"教養費":12600}ヒント
編集 LuaGate編集部