辞書の基本でキーから値を取り出す

生田 陸人
LuaGate エンジニア / 現役エンジニア
編集 LuaGate編集部

このレッスンで分かること

  • 辞書 (dict) は {"key": value} の形でキーから値を取り出すマッピング型です
  • 存在しないキーは d[key] だと KeyErrord.get(key, default) ならデフォルト値が返ります
  • 最小例は def get_value(user, key): return user.get(key, "unknown")

辞書の基本でキーから値を取り出す とは

Python の dict でキーから値を取り出す基本操作を学びます。本レッスンでは、辞書の基本でキーから値を取り出す の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。

辞書の基本でキーから値を取り出す

リストは「順番」で要素を管理しますが、辞書 (dict) は キー で要素を管理するデータ構造です。例えばユーザー情報を扱うとき、users[0]["name"] のようにキーで取り出せれば、index で覚えるよりずっと直感的。JSON、API レスポンス、設定ファイル、データベースの行データなど、現実のデータの多くが「キーと値のペア」でできています。Python で実務をやるなら、dict の操作はリストと並んで最重要スキルです。

辞書は {key: value, ...} の形で書く、Python 標準のマッピング型。list と並んで最頻出のデータ構造です。

辞書とは?

辞書は キーと値のペア を 0 個以上持つコレクションです。キーには 文字列 整数 タプル などのハッシュ可能な値が使えます。値は何でも OK。リストや別の辞書を値にしてネストできるので、JSON とほぼ同じ構造を表現できます。

Python

user = {"name": "Taro", "age": 28, "city": "Tokyo"} print(user["name"]) # Taro print(user["age"]) # 28

user["name"] のように [] の中にキーを書いて値を取り出します。リストの index と似ていますが、中身が キー であることが違いです。順番ではなく 意味 で値にアクセスできるのが辞書の強みです。

よく使う操作

下記の通り、基本操作は次のとおりです。

操作書き方
値の取得d[key]user["name"]
安全な取得d.get(key, default)user.get("phone", "")
値の代入d[key] = valueuser["age"] = 29
削除del d[key]del user["city"]
キー存在チェックkey in d"name" in user

d[key]存在しないキー にアクセスすると KeyError 例外が出ます。デフォルト値を使いたいときは d.get(key, default) を選びましょう。

Python

user = {"name": "Taro"} print(user.get("age", 0)) # 0 ← デフォルト # print(user["age"]) # KeyError

動きを追ってみる

diagram (will load when visible)

動きを箇条書きで言い換えると、次のとおりです。

  • d[key] 系はキー存在なら値、なければ KeyError
  • d.get(key, default) はキー存在なら値、なければ default
  • key in d は存在を真偽値で返す (副作用なし)
  • 内部はハッシュテーブル、検索は要素数に関わらず O(1)

リストで「キーを線形探索」するより圧倒的に効率的、これが辞書を選ぶ理由の一つです。

動的に辞書を作る

空の辞書から始めて値を足していくスタイルも可能です。

Python

scores = {} scores["alice"] = 90 scores["bob"] = 75 scores["alice"] = 95 # 既存キーは上書き print(scores) # {'alice': 95, 'bob': 75}

同じキーに代入すると 上書き されます。新規キーなら追加。この性質はカウントや集計に便利で、次の章で扱う グループ化 でも活躍します。

よくある間違い

  1. 存在しないキーに d[key] でアクセスして KeyError を起こす。デフォルトが欲しいなら d.get(key, default) を使うか、if key in d で先に確認しましょう。
  2. キーに リスト を渡してしまう。リストは可変なのでハッシュ化できず、TypeError になります。代わりに タプル を使いましょう。
  3. dictfor で回すと キーだけ が取れる、と覚えておきましょう。値も同時に欲しいなら .items() を使います (次のレッスンで詳しく扱います)。

辞書は Python 3.7 以降、挿入順を保持 することが言語仕様で保証されました。「順番のある辞書」として安心して使えます。

list と dict の使い分け

同じ種類のもの を順に並べたい」ならリスト、「異なる項目 をキー名で区別したい」なら辞書、というのが基本の使い分けです。例えば「商品の一覧」はリスト、「1 件の商品の属性」は辞書、という具合。両方を組み合わせた list[dict] の構造は、JSON や API レスポンスでよく見かける形です。

Python

products = [ {"name": "Tシャツ", "price": 1980}, {"name": "ジーンズ", "price": 4980}, ] print(products[0]["name"]) # Tシャツ
目的データ構造アクセス
同じ種類のものを並べるlistlst[i] (index)
1 件の属性を表すdictd["key"] (キー)
複数件の属性を扱うlist[dict]lst[i]["key"]
一意性が必要setvalue in s

リストの index で 1 件を取り出し、辞書のキーで属性を取り出す、二段構えで深い構造もスッキリ書けます。

この章のポイント

ここまでの要点 辞書はキーで値を取り出すマッピング型。d[key] は存在しないと KeyErrord.get(key, default) なら安全。リストは順番、辞書は意味、というのが使い分けの軸。

やってみよう

ユーザー辞書 user とキー key を受け取り、対応する値を返す関数 get_value を書いてみましょう。手順は次のとおりです。

  1. def get_value(user, key): で関数を定義する
  2. user.get(key, "unknown")return する
  3. キーが存在するときは値、しないときは "unknown" が返ることをテストで確認する

d.get(key, default) を使うと一行で書けます。これ一つで辞書アクセスの基本は身に付いたと言えます。

よくある質問

Q. 辞書の存在しないキーを参照するとどうなりますか?

A. d['missing'] は KeyError になります。安全に取り出すには d.get('missing', default) を使い、複雑な処理を書くなら collections.defaultdict を使うとキー初期化が省けます。in 演算子(if 'k' in d)で事前確認するのも定石です。

Q. 辞書のキーには何でも使えますか?

A. ハッシュ可能(イミュータブル)な値だけが使えます。文字列、数値、タプルは OK ですが、リストや辞書はキーにできません。タプルにすれば座標 (x, y) や複合キーとして使えるので、辞書を多重キーにしたいときに便利です。

Q. 辞書を for で回すと何が取れますか?

A. デフォルトはキーだけです。値も欲しい場合は d.values()、両方なら d.items() を使い for k, v in d.items(): と書きます。順序は Python 3.7 以降は挿入順が保証されているため、追加順に処理されます。

次のレッスン

次は 辞書を for で走査する で、Python の dict でキーから値を取り出す基本操作を学びます を学びます。

事前確認 — 進む前に次の 3 つができることを確認しましょう。

  1. 辞書の基本 の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. 辞書の基本 とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン

要件

  1. d.get(key, default) でキー未存在時に "unknown" を返す
  2. KeyError を起こさない
  3. 存在するキーは元の値をそのまま返す

入出力例

test-cases.txt

get_value({"age":28,"name":"Taro"}, "name")"Taro" get_value({"age":28,"name":"Taro"}, "age")28 get_value({"name":"Taro"}, "phone")"unknown" get_value({}, "anything")"unknown"

ヒント

main.py
main.py
学習モード

メモ

辞書の基本でキーから値を取り出す

⌘S で保存