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、順番を保ちたいときはリストのままが向いています。道具の役割で選んでください。

要件

  1. 波かっこを使った set 内包表記で重複を落とすこと
  2. 全ての月の支出を対象にすること
  3. 返り値は 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編集部
main.py
学習モード

メモ

set内包表記

⌘S で保存