
はじめに
Pythonにおいて、dictはよく使用されるデータ型の一つです。dictの中にはkeyとvalueがペアとなって保存されており、keyを指定することでvalueを取得できます。しかし、存在しないkeyを指定した場合、エラーが発生してしまいます。
そこで、本記事ではPythonのdictでkeyが存在するか確認する方法について解説します。
keyの存在確認についての必要性
dictに存在しないkeyを指定すると、KeyErrorが発生します。そのため、事前にkeyが存在するかを確認してから処理を行う必要があります。
例えば、以下のようなdictがあったとします。
1 | fruits = { 'apple' : 100 , 'banana' : 200 , 'orange' : 300 } |
ここで、存在しないkeyを指定してvalueを取得しようとすると、KeyErrorが発生します。
1 | print (fruits[ 'grape' ]) |
1 2 3 4 5 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - KeyError Traceback (most recent call last) <ipython - input - 3 - 8bfc5a49e4a8 > in <module>() - - - - > 1 print (fruits[ 'grape' ]) KeyError: 'grape' |
このようなエラーを避けるために、keyの存在確認を行う必要があります。
in演算子を用いた方法
Pythonでは、in演算子を用いることでdictにkeyが存在するかを確認することができます。
1 2 3 4 5 | fruits = { 'apple' : 100 , 'banana' : 200 , 'orange' : 300 } if 'apple' in fruits: print ( 'apple exists' ) else : print ( 'apple does not exist' ) |
上記のコードでは、’apple’がfruitsのkeyに存在するかを確認し、存在する場合は’apple exists’、存在しない場合は’apple does not exist’というメッセージを表示します。
この方法の利点は、シンプルであることです。しかし、大きなdictの場合、in演算子を用いると処理に時間がかかることがあります。
getメソッドを用いた方法
dictにはgetメソッドがあり、このメソッドを用いることでkeyの存在確認を行うことができます。
1 2 3 4 5 | fruits = { 'apple' : 100 , 'banana' : 200 , 'orange' : 300 } if fruits.get( 'apple' ) is not None : print ( 'apple exists' ) else : print ( 'apple does not exist' ) |
上記のコードでは、getメソッドを用いて’apple’がfruitsのkeyに存在するかを確認し、存在する場合は’apple exists’、存在しない場合は’apple does not exist’というメッセージを表示します。
この方法の利点は、in演算子に比べて処理が早くなることです。また、getメソッドには第二引数を指定することができ、keyが存在しない場合には指定した値を返すことができます。
1 2 | fruits = { 'apple' : 100 , 'banana' : 200 , 'orange' : 300 } print (fruits.get( 'grape' , 0 )) |
上記のコードでは、’grape’がfruitsのkeyに存在しない場合には0を返します。
KeyErrorの例外処理を用いた方法
dictには、キーが存在しない場合に発生するKeyErrorを捕捉することができます。try-except文を用いることで、KeyErrorが発生した場合にエラーメッセージを表示することができます。
1 2 3 4 5 | fruits = { 'apple' : 100 , 'banana' : 200 , 'orange' : 300 } try : print (fruits[ 'grape' ]) except KeyError: print ( 'grape does not exist' ) |
上記のコードでは、’grape’がfruitsのkeyに存在しない場合には’grape does not exist’というメッセージを表示します。
この方法の利点は、in演算子やgetメソッドよりもわかりやすく、エラーメッセージを表示することができることです。
各方法のパフォーマンス比較
それでは、各方法のパフォーマンスを比較してみましょう。以下のコードを実行し、各方法の処理時間を計測します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import time fruits = { str (i): i for i in range ( 1000000 )} start = time.time() if '999999' in fruits: pass end = time.time() print ( 'in:' , end - start) start = time.time() if fruits.get( '999999' ) is not None : pass end = time.time() print ( 'get:' , end - start) start = time.time() try : fruits[ '999999' ] except KeyError: pass end = time.time() print ( 'KeyError:' , end - start) |
上記のコードでは、100万個の要素を持つdictから、最後の要素のkeyを検索しています。
実行結果は以下のようになります。
1 2 3 | in : 0.0003008842468261719 get: 0.00015783309936523438 KeyError: 9.5367431640625e - 07 |
上記の結果から、KeyErrorを用いた方法が最も高速であることがわかります。
まとめ
Pythonのdictでkeyが存在するか確認する方法について解説しました。
- in演算子を用いた方法はシンプルであるが、処理に時間がかかることがある。
- getメソッドを用いた方法はin演算子に比べて処理が早く、第二引数でデフォルト値を指定することができる。
- KeyErrorを用いた方法はエラーメッセージを表示することができ、最も高速である。
keyの存在確認を行う際には、使用環境に応じて最適な方法を選択するようにしましょう。