Python環境を起動中... 初回のみ数秒かかります
Lesson 8 / 20

辞書(dict)

このレッスンで学ぶこと

  • 辞書でキーと値のペアを管理できる
  • 追加・更新・削除(CRUD)操作ができる
  • items()/keys()/values() でループできる
  • ネスト辞書で階層的なデータ(患者情報・JSON)を扱える

1. 辞書の作成とアクセス

辞書は キー(key)と値(value)のペア を格納するデータ構造です。 波括弧 {} で作成し、dict[key] で値にアクセスします。

医療・AIの現場では患者情報、DICOM属性、APIのJSONレスポンス、 PyTorchのハイパーパラメータ管理など至る所で辞書が使われます。 辞書 ≒ JSON と覚えておくと実感が湧くでしょう。

sample_1.py
Ctrl+Enter
出力

💡 [] vs get() の使い分け: dict[key] はキーが存在しないと KeyError が発生します。 dict.get(key, default) はキーがなければデフォルト値を返します。 存在するか不確かなキーには get() を使うのが安全です。

2. 追加・更新・削除

辞書はミュータブル(変更可能)です。 キーへの代入1つで追加・更新を使い分けられるのが辞書の特徴です。

「キーが存在するかどうか」で動作が変わります: record["key"] = 値 と書いたとき、そのキーがすでにあれば上書き(更新)、 なければ新しいキーとして追加されます。 削除には del(戻り値なし)と pop()(削除した値を返す)の2通りがあり、 「取り出して使いたい場合」は pop()、「単に消したいだけ」は del と覚えておきましょう。

sample_2.py
Ctrl+Enter
出力

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(): # キーと値のペア(最も多用)
sample_3.py
Ctrl+Enter
出力

💡 辞書は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属性はネスト辞書として扱うことが多いです。

sample_4.py
Ctrl+Enter
出力

💡 辞書のリスト 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. 練習問題

問題 1

患者辞書を作り、年齢を更新する

患者「鈴木 花子」(ID: P005、年齢: 45、血液型: B+)の辞書を作成し、 誕生日が来て年齢が 46 になったので更新してください。 更新前後の年齢を出力してください。

exercise_1.py
出力
ヒントを見る(答え+解説)
# 患者辞書を作成
patient = {
    "id": "P005",
    "name": "鈴木 花子",
    "age": 45,
    "blood_type": "B+"
}

print("更新前の年齢:", patient["age"])  # 45

# 年齢を 46 に更新
patient["age"] = 46

print("更新後の年齢:", patient["age"])  # 46

辞書の値を更新するには、既存のキーに新しい値を代入するだけです。存在するキーへの代入は更新、存在しないキーへの代入は追加になります。

問題 2

辞書のキーと値を逆転させる

疾患コードとその名称の辞書があります。 「名称 → コード」の逆引き辞書を作成してください。

exercise_2.py
出力
ヒントを見る(答え+解説)
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行で書けます。

問題 3

複数患者から条件に合う患者を検索する

患者リスト(辞書のリスト)から年齢が 60 歳以上の患者を全員出力してください。

exercise_3.py
出力
ヒントを見る(答え+解説)
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)を表現できる

自由に試してみましょう:

free_practice.py
Ctrl+Enter
出力

完了するとトップページに進捗が表示されます