set内包表記
このレッスンでできるようになること。set 内包表記を使って、重複のない利用カテゴリ一覧を1行で作れるようになります。
第2章で作った月別のデータは、月をキー、その月の支出リストを値とする辞書でした。
monthly = {
"2026-06": [{"name": "スーパー", "amount": 3200, "category": "食費"}],
"2026-07": [{"name": "コンビニ", "amount": 620, "category": "食費"}],
}ここから「これまでに使ったカテゴリの一覧」が欲しくなります。同じカテゴリは何度も出てくるので、そのままリストにすると重複だらけになります。set は重複を自動的に落としてくれる集合の型なので、この用途にぴったりです。
書き方は辞書内包表記とよく似ていて、波かっこの中にキーと値ではなく値を1つだけ書きます。
categories = {e["category"] for e in expenses}月別の辞書から全件を見るときは、for を2つ並べます。左から順に外側のループ、内側のループになるので、月のリストを取り出してから、その中の支出を1件ずつ見る、という並びです。
categories = {e["category"] for items in monthly.values() for e in items}ここで大事な注意があります。set には並び順がありません。同じコードを走らせても、表示される順番が前と違うことがあります。画面に出すときや、他の関数に渡して結果を比べるときは、必ず sorted() を通してリストに直してください。sorted はもとが set でも並んだリストを返します。
重複を落とす目的が無いなら、set にする必要はありません。件数を数えたいときは第2章の Counter、順番を保ちたいときはリストのままが向いています。道具の役割で選んでください。
要件
- 波かっこを使った set 内包表記で重複を落とすこと
- 全ての月の支出を対象にすること
- 返り値は sorted で並べ替えたリストにすること
入出力例
used_categories({"2026-06":[{"amount":3200,"category":"食費","name":"スーパー"},{"amount":480,"category":"交通費","name":"電車代"}],"2026-07":[{"amount":620,"category":"食費","name":"コンビニ"},{"amount":2800,"category":"教養費","name":"書籍"}]}) → ["交通費","教養費","食費"]
used_categories({"2026-08":[{"amount":2100,"category":"食費","name":"スーパー"},{"amount":540,"category":"食費","name":"パン屋"}]}) → ["食費"]ヒント
編集 LuaGate編集部