ネストされた辞書の値を取得する安全な方法 質問する

ネストされた辞書の値を取得する安全な方法 質問する

ネストされた辞書があります。値を安全に取り出す方法は 1 つだけですか?

try:
    example_dict['key1']['key2']
except KeyError:
    pass

get()あるいは、Pythonにはネストされた辞書のようなメソッドがあるのでしょうか?

ベストアンサー1

2 回使用することもできますget

example_dict.get('key1', {}).get('key2')

またはのいずれかが存在しないNone場合に返されます。key1key2

存在するが辞書 (またはメソッドを持つ辞書のようなオブジェクト)ではないAttributeError場合、依然としてエラーが発生する可能性があることに注意してください。投稿したコードでは、添え字付けできない場合に代わりにエラーが発生します。example_dict['key1']gettry..exceptTypeErrorexample_dict['key1']

もう 1 つの違いは、try...except最初のキーがなくなるとすぐにショートすることです。呼び出しのチェーンではgetショートしません。


構文はそのままに、example_dict['key1']['key2']KeyErrorsを発生させたくない場合は、ハッシャーのレシピ:

class Hasher(dict):
    # https://stackoverflow.com/a/3405143/190597
    def __missing__(self, key):
        value = self[key] = type(self)()
        return value

example_dict = Hasher()
print(example_dict['key1'])
# {}
print(example_dict['key1']['key2'])
# {}
print(type(example_dict['key1']['key2']))
# <class '__main__.Hasher'>

キーが欠落している場合は空の Hasher を返すことに注意してください。

Hasherは のサブクラスなので、dictとほぼ同じように Hasher を使用できますdict。同じメソッドと構文がすべて使用可能ですが、Hashers では欠落しているキーの扱いが異なるだけです。

通常dictの を に変換できますHasher

hasher = Hasher(example_dict)

同様に簡単に、をHasher通常の に変換します。dict

regular_dict = dict(hasher)

別の方法としては、ヘルパー関数で醜い部分を隠すことです。

def safeget(dct, *keys):
    for key in keys:
        try:
            dct = dct[key]
        except KeyError:
            return None
    return dct

したがって、コードの残りの部分は比較的読みやすいままになります。

safeget(example_dict, 'key1', 'key2')

おすすめ記事