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"]) # → 30uv 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)) # → 0if-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 / JSON | collection/ch05-nested |
| Pydantic で型付き dict | FastAPI 本編 |
力試ししたい方は クイズ形式の演習(任意) もあります。読むだけでも十分です。