1. 辞書の作成とアクセス
辞書は キー(key)と値(value)のペア を格納するデータ構造です。
波括弧 {} で作成し、dict[key] で値にアクセスします。
医療・AIの現場では患者情報、DICOM属性、APIのJSONレスポンス、 PyTorchのハイパーパラメータ管理など至る所で辞書が使われます。 辞書 ≒ JSON と覚えておくと実感が湧くでしょう。
💡 [] vs get() の使い分け:
dict[key] はキーが存在しないと KeyError が発生します。
dict.get(key, default) はキーがなければデフォルト値を返します。
存在するか不確かなキーには get() を使うのが安全です。
2. 追加・更新・削除
辞書はミュータブル(変更可能)です。 キーへの代入1つで追加・更新を使い分けられるのが辞書の特徴です。
「キーが存在するかどうか」で動作が変わります:
record["key"] = 値 と書いたとき、そのキーがすでにあれば上書き(更新)、
なければ新しいキーとして追加されます。
削除には del(戻り値なし)と pop()(削除した値を返す)の2通りがあり、
「取り出して使いたい場合」は pop()、「単に消したいだけ」は del と覚えておきましょう。
3. 辞書のループ
辞書には3種類のループ方法があります。 目的に応じて使い分けると意図が明確なコードになります。
実務では for key, value in dict.items(): が圧倒的に多く使われます。
辞書の中身を全件チェックする・変換してリストに集める・
条件に合うキーだけ取り出す、といった処理のほとんどが
.items() で解決できます。
💡 3種類のループ方法:
d = {"name": "田中", "age": 58, "ward": "内科"}
for key in d: # キーだけ → "name", "age", "ward"
for key in d.keys(): # 上と同じ(keys() を明示したい場合)
for value in d.values(): # 値だけ → "田中", 58, "内科"
for key, value in d.items(): # キーと値のペア(最も多用)
💡 辞書はPython 3.7以降、挿入順を保持:
以前のPythonでは辞書のループ順は不定でしたが、Python 3.7以降はキーを追加した順番でループされます。
アルファベット順でも昇順でもなく、追加した順番であることに注意してください。
# C → A → B の順に挿入した場合
d = {}
d["C項目"] = 3
d["A項目"] = 1
d["B項目"] = 2
for k, v in d.items():
print(k, v)
# 出力: C項目 3 → A項目 1 → B項目 2
# ← アルファベット順ではなく、挿入した順番になる
「順序に依存したロジック(先頭・末尾の取り出しなど)」には list を使う方が意図が明確です。
4. ネスト辞書と辞書のリスト
辞書の値に辞書やリストを入れることができます。 これを ネスト辞書 と呼びます。 JSONデータはまさにこの構造です。医療AIのAPIレスポンスや DICOM属性はネスト辞書として扱うことが多いです。
💡 辞書のリスト vs ネスト辞書:
辞書のリスト ─ 「同じ構造のレコードが複数ある」場合に使う(for でループしやすい)
# 複数の患者、それぞれが同じ構造を持つ
patients = [
{"id": "P001", "age": 58},
{"id": "P002", "age": 34},
]
for p in patients:
print(p["id"], p["age"]) # forループで全員をまとめて処理できる
ネスト辞書 ─ 「1つのオブジェクトが階層的な属性を持つ」場合に使う(JSONそのもの)
# 1人の患者が複数の属性グループを持つ
patient = {
"id": "P001",
"vitals": {"hr": 72, "spo2": 97}, # バイタルグループ
"diagnoses": ["2型糖尿病"] # 診断リスト
}
print(patient["vitals"]["hr"]) # キーを2段階たどってアクセス → 72
どちらも実際の医療データやAI APIレスポンスで頻繁に登場します。
5. 練習問題
患者辞書を作り、年齢を更新する
患者「鈴木 花子」(ID: P005、年齢: 45、血液型: B+)の辞書を作成し、 誕生日が来て年齢が 46 になったので更新してください。 更新前後の年齢を出力してください。
ヒントを見る(答え+解説)
# 患者辞書を作成
patient = {
"id": "P005",
"name": "鈴木 花子",
"age": 45,
"blood_type": "B+"
}
print("更新前の年齢:", patient["age"]) # 45
# 年齢を 46 に更新
patient["age"] = 46
print("更新後の年齢:", patient["age"]) # 46
辞書の値を更新するには、既存のキーに新しい値を代入するだけです。存在するキーへの代入は更新、存在しないキーへの代入は追加になります。
辞書のキーと値を逆転させる
疾患コードとその名称の辞書があります。 「名称 → コード」の逆引き辞書を作成してください。
ヒントを見る(答え+解説)
disease_codes = {
"E11": "2型糖尿病",
"I10": "高血圧",
"J18": "肺炎",
"K92": "消化器疾患"
}
# 逆引き辞書(名称 → コード)を作成
reverse_dict = {}
for code, name in disease_codes.items():
reverse_dict[name] = code
print("逆引き辞書:", reverse_dict)
print("2型糖尿病のコード:", reverse_dict.get("2型糖尿病")) # E11
.items() でキーと値のペアをループし、キーと値を入れ替えて新しい辞書に追加します。次のレッスンで学ぶ辞書内包表記では {v: k for k, v in disease_codes.items()} と1行で書けます。
複数患者から条件に合う患者を検索する
患者リスト(辞書のリスト)から年齢が 60 歳以上の患者を全員出力してください。
ヒントを見る(答え+解説)
patients = [
{"id": "P001", "name": "田中", "age": 58},
{"id": "P002", "name": "鈴木", "age": 34},
{"id": "P003", "name": "佐藤", "age": 71},
{"id": "P004", "name": "高橋", "age": 62},
{"id": "P005", "name": "渡辺", "age": 45},
]
print("60歳以上の患者:")
for p in patients:
if p["age"] >= 60:
print(f" {p['id']}: {p['name']}({p['age']}歳)")
# → P003: 佐藤(71歳)
# → P004: 高橋(62歳)
辞書リストのループでは p["キー名"] で各患者の属性にアクセスします。JSON形式のAPIレスポンスや患者データベースの処理で頻繁に使うパターンです。
まとめ
このレッスンのポイント
- 辞書はキー→値のマッピング。
{key: value}で作成しdict[key]でアクセス - 存在しないキーには
.get(key, default)が安全。[]は KeyError が出る - 追加・更新は同じ代入構文。
del dict[key]または.pop(key)で削除 .items()で (key, value) のペアをループする(最頻出パターン)- 辞書の値に辞書やリストを入れてネスト構造(≒ JSON)を表現できる
自由に試してみましょう:
完了するとトップページに進捗が表示されます