辞書は「キーで引く」データ構造
リストが位置(インデックス)でアクセスするのに対して、Python の辞書(dict)はキーで値を引きます。キーには文字列や数値を使うのが一般的で、それぞれが対応する値にひも付きます。このシンプルな発想の転換だけで、在庫管理、設定ファイル、JSON データ、ユーザープロフィール、キャッシュなど、応用範囲が一気に広がります。
キーと値には、ほぼ何でも入れられます。キーはハッシュ可能である必要があり(数値、文字列、タプルはOK。リストや別の辞書はNG)、値には特に制限はありません。辞書の中に辞書やリストを入れることもできます。
Python 辞書の作り方
作り方はいくつかあって、それぞれ使いどころが違います。
値を取り出す
取り出し方は2通りありますが、どちらを使うかで挙動が変わります。
用途で使い分けましょう。
[]を使う場面: そのキーが 絶対に 存在しているはずのとき。もし無ければそれはバグなので、エラーで派手に落ちてくれた方が助かります。.get()を使う場面: 「キーが無いこともある」が正常系のとき。try/except を書かずにデフォルト値を返せます。
要素の追加・更新・削除
キーに値を代入すれば、新規作成も上書きもこれ一つで済みます。
update() は別の辞書やキーと値のペアのイテラブルをマージします:
overrides と settings で同じキーがあると、overrides 側で上書きされます。
キーの存在確認
in で調べられるのはキーであって、値ではありません。
値だけをチェックしたいときは、user.values() を使います。
辞書をループで回す方法
python 辞書のループには、次の3つのビューが使えます。
.items() は実戦で一番出番が多い書き方です。キーと値のペアを展開した状態で受け取れるので、そのまま使い始められます。
ループの順序については、Python 3.7 以降なら挿入順が保持されます。辞書は「中身の順番が適当な入れ物」ではありません。a → b → c の順に追加したなら、ループもその順で回ります。これは言語仕様として保証されている挙動なので、安心して頼って大丈夫です。
Python 辞書のソート方法
辞書は挿入順を保つ仕様なので、「辞書をソートする」というのは実質、狙った順番でキーを入れ直した新しい辞書を作るという意味になります。
sorted() はタプルのペアからなるリストを返すので、それを dict(...) で包み直せば、新しい順序の辞書ができあがります。並び替えたペアだけ欲しくて辞書にする必要がなければ、外側の dict() は省いてOKです。
python 辞書を結合する方法
Python 3.9以降では、| 演算子が使えます。
キーが衝突した場合は、後ろ側の辞書の値が優先されます。インプレースで同じことをしたいときは .update() を使いましょう。古いバージョンの Python を使っている場合は {**defaults, **overrides} という書き方で対応できます。
setdefault パターン
実務でよく出てくるのが、「キーがあればその値を使い、なければデフォルト値をセットしてから使う」というパターンです。
より簡単なのは、collections.Counter を使う方法です。
Counter は dict のサブクラスで、要素の出現回数を数えるのに特化したクラスです。「何かの登場回数をカウントしたい」と思ったら、まず候補に挙がるのがこれ。
辞書内包表記
リスト内包表記と同じノリで、辞書をサッと作れる書き方です:
ルールはリスト内包表記と同じで、{} の中に key: value を書くだけです。
JSON とそっくりな辞書
Python の辞書は JSON オブジェクトとほぼそのまま対応しています。相互変換もワンライナーで済みます。
Web 開発で辞書をよく見かけるのはこれが理由です。API のリクエストやレスポンスは、結局のところネットワークを挟んだ dict 操作そのものなんです。
実践例:ユーザープロファイル
設定ファイルっぽい感じで、ユーザー情報を管理する小さなプログラムを書いてみましょう。
ネストされた辞書、ミュータブルな値、デフォルト値付きの .get() ——レコード型のデータを扱うときの基本ツールはこれで一通りそろいました。
次のステップ
リスト、タプル、セット、辞書。この4つのコレクションさえ押さえておけば、プログラミング初期に出会うデータのほとんどはモデリングできます。次に学ぶのはリスト内包表記です。あるコレクションを別のコレクションへと変換する、Pythonらしいコンパクトな書き方を見ていきましょう。
よくある質問
Pythonの辞書(dict)とは何ですか?
辞書はキーと値をペアで保持するデータ構造です。リストのように prices[0] と番号で取り出すのではなく、prices['apple'] のようにキーを指定して値を取り出します。読み書きが高速で、キーは重複NG。なお最近のPythonでは、追加した順序がそのまま保持されます。
Pythonの辞書にキーを追加するにはどうすればいい?
単純に代入するだけでOKです。my_dict['new_key'] = 'new value' と書けば、キーが存在しなければ新規追加、すでにあれば値が上書きされます。「追加」と「更新」で構文を使い分ける必要はなく、どちらも同じ書き方です。
dict[key] と dict.get(key) の違いは?
dict[key] はキーが存在しないと KeyError が発生します。一方 dict.get(key) は、キーがなければ None(または指定したデフォルト値)を返します。キーが無いこともあり得る想定なら .get()、無かったらバグという場面では [key] を使う、と覚えておくとよいです。