Pythonでネストされたdictにアクセスしたいが、存在しないときはNoneにしたい

シェアする

スポンサーリンク

3秒でわかる

仕組みを詳しく説明します。

前提

Pythonにおいて辞書(dict)のvalueはdictを含むことができる。

例えば、first_dict[‘second’] = second_dict のとき、つまり、first_dictという辞書型変数(dict)があって、’second’キーの値がsecond_dictという辞書型変数(dict)である場合、このsecond_dictの’mykey’の値にアクセスしたいときは、

とすればよい。

しかし、これだと’second’というキーが存在しないときにエラーになる (KeyError)

dictのgetメソッド

dictのgetメソッドはキーが存在しないときデフォルト値のNoneを返す。だから、mydictに’hogekey’というキーが存在するかわからないときは、

とすればよい。これで、hogeには’hogekey’というキーが存在するならその値(value)が入るし、存在しないならNoneが入る。もちろん、KeyErrorは発生しない。

デフォルト値はNone以外にすることも可能で、

とすれば、存在しないときはNoneではなく’default’が入ることになる。

getメソッドを重ねると?

では、今回のネストされた辞書型(dict)のケースでは、getを2つ使えばよいのかというとそうもいかない。確かに、KeyErrorは起きなくなるのだが、代わりにTypeErrorが起きる可能性がある。というのも、例えば、

としたとき、first_dictに’second’キーがあり、それがdictならば、mykeyの存在にかかわらずエラーは起きない。しかし、’second’キーがなかったり、dict以外の型ならNone.get(‘mykey’)と同じことになるので、TypeErrorが発生するのである。

これを解決するには、先程の方法を用いてデフォルト値を変更する。

‘second’キーが存在しないときは、空のdictを返すようにするのである。{}にはもちろん’mykey’は含まれていないので、{}.get(‘mykey’)はNoneを返す。エラーは発生しない。

ちなみに、’second’の値が存在して、dict以外の型だったらエラーが発生するが、dictを想定している変数に他の型の変数が入るのは設計上良くないと思うので…

自分は今まで知らなかったテクニックなのですが、可読性もそこまで損なわれない、自然な書き方なので積極的に使っていきたいと思います。

スポンサーリンク

シェアする

フォローする