採点されません。匿名です。 間違えることは学習の一部です。読むだけでもかまいません。

L?? ch04 — dict (辞書)

テクノロジ系 / L05 collection — コレクション

L?? ch04 — dict (辞書)

キー / 値ペアでデータを表現する collection 型

ゴール

  • dict リテラル {"key": value} を書ける
  • キーで値を取得・更新できる
  • in で存在チェックできる
  • .get() でデフォルト値を扱える
  • 2 つの dict を「マージ」できる

なぜ dict か

FastAPI で扱う JSON / クエリパラメータ / DB のレコードは、ほぼ全部 dict 構造。

# FastAPI の JSON レスポンスはこの形
{"id": 1, "name": "Taro", "active": True}

list (添字でアクセス) より先に dict に慣れると、FastAPI が一気に読める。

最小例

# main.py
user = {"name": "Taro", "age": 30}

print(user["name"])   # → Taro
print(user["age"])    # → 30
uv run python main.py

値の追加・更新

user = {"name": "Taro"}

user["age"] = 30          # 追加
user["name"] = "Jiro"     # 上書き

print(user)
# → {'name': 'Jiro', 'age': 30}

dict は ミュータブル (中身を書き換えられる)。

存在チェック

user = {"name": "Taro", "age": 30}

# キーがあるかどうかは `in` で見る
if "age" in user:
    print(user["age"])

# 値ではなくキー側を見る点に注意
print("Taro" in user)   # → False (キーには "Taro" は無い)
print("name" in user)   # → True

.get() — デフォルト値

user = {"name": "Taro"}

# ❌ 存在しないキーは KeyError
# print(user["age"])  # KeyError: 'age'

# ✅ .get() なら None を返す
print(user.get("age"))           # → None

# ✅ デフォルト値を指定できる
print(user.get("age", 0))        # → 0

if-in で守るより .get(key, default) の方が短い。

ループ

user = {"name": "Taro", "age": 30}

# キーだけ
for k in user:
    print(k)              # name, age

# キーと値のペア
for k, v in user.items():
    print(f"{k}={v}")     # name=Taro, age=30

.items() は (key, value) のタプルを順番に返す。

dict のマージ (重要)

defaults = {"theme": "light", "lang": "ja"}
overrides = {"lang": "en", "debug": True}

# 方法 1: ** 展開 (Python 3.5+)
merged = {**defaults, **overrides}

# 方法 2: | 演算子 (Python 3.9+)
merged = defaults | overrides

print(merged)
# → {'theme': 'light', 'lang': 'en', 'debug': True}

後ろの dict が勝つ (overrides の "lang": "en" が優先)。

マージの使いどころ

# 設定ファイルのデフォルト値に環境変数を上書き
config = {**default_config, **env_config}

# FastAPI のレスポンスに共通フィールドを足す
response = {**user_data, "version": "1.0"}

「ベース + 差分」のパターンは API / 設定 / テストデータで頻出。

よくある間違い

# ❌ キーをクオートし忘れ
user = {name: "Taro"}        # NameError: name 'name' is not defined

# ❌ 順番が逆 ({key: value} が正しい)
user = {"Taro": "name"}      # 動くが意味が逆

# ❌ list と混同
user[0]                       # KeyError (dict は整数キーが無い限り [0] は使えない)

drill

drill/01-fill-dict-merge — 2 つの dict をマージする関数を完成させる

まとめ

操作書き方
作る{"k": v}
読むd["k"] または d.get("k", default)
書くd["k"] = v
在り判定"k" in d
ループfor k, v in d.items():
マージ{a, b} または `a \b`

次に学ぶ領域

領域続けて読む
list (順序付きコレクション)collection/ch01-list
ネストした dict / JSONcollection/ch05-nested
Pydantic で型付き dictFastAPI 本編
力試ししたい方は クイズ形式の演習(任意) もあります。読むだけでも十分です。