辞書を for で走査する

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

辞書を for で走査する とは

辞書のキーと値を for ループで処理する方法を学びます。本レッスンでは、辞書を for で走査する の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。

辞書を for で走査する

辞書 (dict) を使い始めると、必ずと言っていいほど 「全てのキーと値を一通り処理したい」 という場面に出会います。例えば「ユーザーごとのスコアを集計したい」「設定値を全部ログに出したい」「ある条件に当てはまる項目だけ抜き出したい」など。こうした処理を支えるのが、辞書の イテレーション (走査) です。Python の辞書は for ループ、.keys().values().items() という 4 つの入り口を用意していて、用途に応じて使い分けられるようになっています。

辞書を for で回すと、デフォルトでは キー が順に取り出されます。値も同時に欲しいなら .items() を使うのが Python の作法です。

走査の基本 4 パターン

下記の通り、辞書の走査は次のとおりです。

書き方取り出されるもの用途
for k in dキーだけキーを列挙したい
for k in d.keys()キーだけ上と同じ、明示的
for v in d.values()値だけ値を集計したい
for k, v in d.items()キーと値ペアで処理したい

.items() が一番出番が多く、(key, value) のタプルを返してくれるので、for k, v in d.items() のように アンパック して使うのが定番のスタイルです。

Python

scores = {"alice": 90, "bob": 75, "carol": 82} # キーだけ for name in scores: print(name) # alice / bob / carol # 値だけ for s in scores.values(): print(s) # 90 / 75 / 82 # キーと値 for name, score in scores.items(): print(f"{name} -> {score}") # alice -> 90 / bob -> 75 / carol -> 82

動きを追ってみる

diagram (will load when visible)

辞書は Python 3.7 以降、挿入順を保証 します。つまり .items() で取り出す順番は、挿入したときの順番と一致します。古いバージョンでは順番が変わったので、その時代の本やコメントは要注意。今は安心して順序を頼れる時代です。

集計の例

辞書の走査は 集計 にもよく使います。「全員の合計点」「最高得点」「キー別の処理」など、.items() と組み合わせると見通しが良くなります。

Python

scores = {"alice": 90, "bob": 75, "carol": 82} total = 0 for name, score in scores.items(): total += score print(total) # 247

sum(scores.values()) と書けばさらに短く 247 を得られますが、for ループの形を覚えておくと条件分岐を入れたいときに応用しやすくなります。

よくある間違い

  1. for k in d のつもりで for k, v in d と書いてしまう。これは「タプルとして 2 要素にアンパック」しようとして失敗するので、for k, v in d.items() と書くのが正解です。
  2. 走査中に辞書のサイズを変える。for k in d の途中で del d[k] をすると RuntimeError が出ます。削除したいなら for k in list(d.keys())コピー を作ってから回しましょう。
  3. .keys() .values() .items() の返り値はリストではなく ビュー です。scores.keys() を変数に入れておくと、元の辞書が変わったらビューも変わります。

ビューはイテラブルかつ動的。リストに変換したいときは list(d.keys()) のように明示的にキャストしましょう。

走査と内包表記の合わせ技

.items() を覚えてしまえば、辞書から自由にリストや別の辞書を生成できるようになります。Python での辞書操作の幅が一気に広がる、まさに基礎中の基礎です。

走査と内包表記を組み合わせれば、辞書から条件付きでリストを作ったり、別の辞書を作ったり、自在に変形できます。

Python

scores = {"alice": 90, "bob": 75, "carol": 82} high = [name for name, s in scores.items() if s >= 80] print(high) # ['alice', 'carol']

for k, v in d.items() if 条件 のリズムは、Python の典型的なフレーズの一つ。慣れると目で見て意味が分かるようになります。.items() のおかげで「ペアでイテレートする」発想に自然に馴染めるはずです。

やってみよう

辞書 scores (str -> int) を受け取り、全ての値の合計 を返す関数 total_score を書いてみましょう。for ... in scores.values() を使って累積するか、もしくは sum(scores.values()) でも構いません。両方試してみると、Python の表現力を体感できます。空辞書のときは 0 を返すこと、ここを忘れずに。

よくある質問

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 ループで処理する方法を学びます を学びます。

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

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

理解度チェック (30 秒)

Q. 辞書を走査 とは何か、1 文で説明してください。

この章のポイント

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

関連レッスン

要件

  1. 辞書の値を走査して合計する
  2. 空辞書のときは 0 を返す
  3. .values() または .items() を使う

入出力例

test-cases.txt

total_score({"alice":90,"bob":75,"carol":82})247 total_score({"taro":100})100 total_score({"a":0,"b":0,"c":5})5 total_score({})0

ヒント

main.py
main.py
学習モード

メモ

辞書を for で走査する

⌘S で保存