辞書の基本でキーから値を取り出す
このレッスンで分かること
- 辞書 (
dict) は{"key": value}の形でキーから値を取り出すマッピング型です- 存在しないキーは
d[key]だとKeyError、d.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"]) # 28user["name"] のように [] の中にキーを書いて値を取り出します。リストの index と似ていますが、中身が キー であることが違いです。順番ではなく 意味 で値にアクセスできるのが辞書の強みです。
よく使う操作
下記の通り、基本操作は次のとおりです。
| 操作 | 書き方 | 例 |
|---|---|---|
| 値の取得 | d[key] | user["name"] |
| 安全な取得 | d.get(key, default) | user.get("phone", "") |
| 値の代入 | d[key] = value | user["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動きを追ってみる
動きを箇条書きで言い換えると、次のとおりです。
d[key]系はキー存在なら値、なければKeyErrord.get(key, default)はキー存在なら値、なければdefaultkey in dは存在を真偽値で返す (副作用なし)- 内部はハッシュテーブル、検索は要素数に関わらず
O(1)
リストで「キーを線形探索」するより圧倒的に効率的、これが辞書を選ぶ理由の一つです。
動的に辞書を作る
空の辞書から始めて値を足していくスタイルも可能です。
Python
scores = {}
scores["alice"] = 90
scores["bob"] = 75
scores["alice"] = 95 # 既存キーは上書き
print(scores) # {'alice': 95, 'bob': 75}同じキーに代入すると 上書き されます。新規キーなら追加。この性質はカウントや集計に便利で、次の章で扱う グループ化 でも活躍します。
よくある間違い
- 存在しないキーに
d[key]でアクセスしてKeyErrorを起こす。デフォルトが欲しいならd.get(key, default)を使うか、if key in dで先に確認しましょう。 - キーに
リストを渡してしまう。リストは可変なのでハッシュ化できず、TypeErrorになります。代わりにタプルを使いましょう。 dictをforで回すと キーだけ が取れる、と覚えておきましょう。値も同時に欲しいなら.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シャツ| 目的 | データ構造 | アクセス |
|---|---|---|
| 同じ種類のものを並べる | list | lst[i] (index) |
| 1 件の属性を表す | dict | d["key"] (キー) |
| 複数件の属性を扱う | list[dict] | lst[i]["key"] |
| 一意性が必要 | set | value in s |
リストの index で 1 件を取り出し、辞書のキーで属性を取り出す、二段構えで深い構造もスッキリ書けます。
ここまでの要点
辞書はキーで値を取り出すマッピング型。d[key] は存在しないと KeyError、d.get(key, default) なら安全。リストは順番、辞書は意味、というのが使い分けの軸。
やってみよう
ユーザー辞書 user とキー key を受け取り、対応する値を返す関数 get_value を書いてみましょう。手順は次のとおりです。
def get_value(user, key):で関数を定義するuser.get(key, "unknown")をreturnする- キーが存在するときは値、しないときは
"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 つができることを確認しましょう。
- 辞書の基本 の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. 辞書の基本 とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン
要件
d.get(key, default)でキー未存在時に"unknown"を返すKeyErrorを起こさない- 存在するキーは元の値をそのまま返す
入出力例
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"