辞書内包表記
このレッスンでできるようになること。辞書内包表記を使って、カテゴリから合計金額への辞書を1行で作れるようになります。
辞書内包表記を、図書室の本の冊数で確かめます。棚の名前をキー、本のリストを値にした辞書から、棚ごとの冊数を作ります。
Python
shelves = {"絵本": ["月の本", "森の本"], "図鑑": ["鳥の本"]}
counts = {shelf: len(books) for shelf, books in shelves.items()}
print(counts) # {'絵本': 2, '図鑑': 1}まず .items() から棚の名前と本のリストを受け取り、左側でキーと値を作ります。演習でも同じ順番で、カテゴリ名と支出リストを受け取ります。
リスト内包表記との違いは2つあります。角かっこではなく波かっこで囲むこと、そして左側に「キー」と「値」を書くことです。キーと値の区切りには辞書と同じ記号を使います。この2つがそろっているものだけが辞書内包表記で、キーだけを書くと別のものになります。それは次のレッスンで扱います。
もとが辞書のときは .items() を付けて、キーと値を同時に受け取るのが定番です。キーだけでよければ for cat in grouped と書けますが、値も使う今回のような集計では items を使ったほうが短くなります。
値の式に別の内包表記を置くこともできます。次の例では、組の名前と数値のリストを受け取ってから、その組の数値を1つずつ2倍にします。
Python
teams = {"赤": [2, 5], "青": [3]}
doubled = {team: [n * 2 for n in scores] for team, scores in teams.items()}
print(doubled) # {'赤': [4, 10], '青': [6]}外側の for で1組を選ぶたびに、内側のリスト内包表記を最後まで実行します。入れ子が読みにくければ、値を作る部分を補助関数に分けられます。演習では金額を合計する _sum_amounts(items) を用意してあるので、辞書内包表記に集中してください。
末尾に if を付けて対象を絞れる点はリストと同じです。たとえば if items と書けば、支出が1件も無いカテゴリを結果から外せます。
要件
- totals を辞書内包表記で作る
- grouped.items() で受け取ったカテゴリ名をキーにする
- 値は支出リストを _sum_amounts に渡した結果にする
ヒント
編集 ゆめさく編集部