Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonの辞書で存在しないキーを安全に扱う方法|KeyError対策を徹底解説

Pythonには「辞書(Dictionary)」と呼ばれるコンテナ型があります。辞書ではキー(key)と値(value)を対応付けて管理でき、値へのアクセスは定数時間で行えるため非常に高速です。しかし、存在しないキーにアクセスしようとすると、エラーが発生してしまうという課題があります。

本記事では、辞書のキーが存在しない場合に発生するエラーへの対処法として、get()メソッド、setdefault()メソッド、そしてcollections.defaultdictの3つの手法をわかりやすく解説します。

存在しないキーにアクセスするとどうなる?

まず、辞書に存在しないキーへ直接アクセスした場合の挙動を確認してみましょう。

サンプルコード

country_dict = {'India' : 'IN', 'Australia' : 'AU', 'Brazil' : 'BR'}
print(country_dict['Australia'])
print(country_dict['Canada'])  # 存在しないキーのためエラーになる

実行結果

AU
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-2-a91092e7ee85> in <module>()
      2
      3 print(country_dict['Australia'])
----> 4 print(country_dict['Canada'])

KeyError: 'Canada'

このように、'Australia'は正常に出力されますが、登録されていない'Canada'にアクセスするとKeyErrorが発生し、プログラムが異常終了します。

方法1:get()メソッドでKeyErrorを回避する

get()メソッドを使えば、キーの有無を安全にチェックできます。このメソッドは2つの引数を受け取ります。第1引数は取得したいキー、第2引数は「キーが見つからなかった場合に返すデフォルト値」です。

  • キーが存在する場合 → 対応する値を返す
  • キーが存在しない場合 → 第2引数で指定したデフォルト値を返す

サンプルコード

country_dict = {'India' : 'IN', 'Australia' : 'AU', 'Brazil' : 'BR'}
print(country_dict.get('Australia', 'Not Found'))
print(country_dict.get('Canada', 'Not Found'))

実行結果

AU
Not Found

'Canada'は辞書に存在しないため、指定しておいたデフォルト値'Not Found'が返され、エラーにならずに処理が継続されます。

方法2:setdefault()メソッドでデフォルト値を設定する

setdefault()メソッドもget()と同様に2つの引数(キーとデフォルト値)を受け取ります。両者の違いは、キーが存在しなかった場合、そのキーとデフォルト値のペアを辞書に新しく追加する点です。

サンプルコード

country_dict = {'India' : 'IN', 'Australia' : 'AU', 'Brazil' : 'BR'}
country_dict.setdefault('Canada', 'Not Present')  # Canadaにデフォルト値を設定
print(country_dict['Australia'])
print(country_dict['Canada'])

実行結果

AU
Not Present

setdefault()を実行した時点で'Canada': 'Not Present'が辞書に追加されるため、その後は通常の添字アクセスでもエラーなく値を取得できます。

方法3:defaultdictを使う

defaultdictはPython標準ライブラリのcollectionsモジュールに含まれるコンテナです。コンストラクタに「デフォルトファクトリ(デフォルト値を生成する関数)」を渡して初期化します。存在しないキーへアクセスすると、このファクトリが生成したデフォルト値が自動的に返されます。

キーが存在しない場合の処理を都度記述する必要がないため、多数のキーアクセスを行う場面では効率的な手法といえます。

サンプルコード

import collections as col
# デフォルトファクトリに「キーが存在しません」という文字列を返す関数を設定
country_dict = col.defaultdict(lambda: 'Key Not Present')
country_dict['India'] = 'IN'
country_dict['Australia'] = 'AU'
country_dict['Brazil'] = 'BR'
print(country_dict['Australia'])
print(country_dict['Canada'])

実行結果

AU
Key Not Present

ここではラムダ式lambda: 'Key Not Present'をデフォルトファクトリとして指定しています。未登録の'Canada'にアクセスしても、エラーではなく指定した文字列が返されることが確認できます。

まとめ:使い分けのポイント

手法特徴
d[key](通常アクセス)キーがないとKeyErrorが発生する
get()キーがなければデフォルト値を返す(辞書は変更されない)
setdefault()キーがなければデフォルト値を返し、かつ辞書に追加する
defaultdictデフォルト値の生成ルールを事前に定義できる

単に値を取得したいだけならget()、存在しないキーをあらかじめ登録しておきたいならsetdefault()、同一種類のオブジェクトを大量に格納する場合はdefaultdictを使うのがおすすめです。状況に応じて適切な手法を選び、堅牢で読みやすいコードを目指しましょう。

  1. Pythonでパターンを出力する方法|三角形・数字・アルファベット・ピラミッドのコード例

    Pythonでパターンを出力するには、ネストされた(入れ子構造の)forループを使用します。外側のループで行数を制御し、内側のループで列数を処理します。そしてprint文を工夫することで、目的に応じたさまざまなパターンを作成できます。パターンには、星(アスタリスク)パターン、数字パターン、アルファベットパターンなどがあり、三角形やピラミッドなど、さまざまな形状にも対応できます。パターン出力の基本これらのパターンは、print文を少し変更しながらforループを組み合わせることで出力できます。基本的な考え方はどのパターンも共通しており、違いはごくわずかです。ここからは、代表的なパターンのコードを実

  2. Pythonの辞書(dict)の使い方を徹底解説!作成・取得・追加・削除の基本

    辞書(Dictionary)は、Pythonで最もよく使われるマッピング型です。キーと値のペアでデータを管理できるため、JavaのMapに似たオブジェクトだと言えます。 Pythonでは、波括弧 {} を使って辞書リテラルを作成します。キーと値はコロン : で結び、各ペアはカンマ , で区切ります。 辞書の作成方法 まずは、基本的な辞書の作成例を見てみましょう。 datedict = { date: 13, month: January, year: 1970 } print(datedict) 実行結果: {date: 13, month: January, year: 197