ネストされた辞書があります。値を安全に取り出す方法は 1 つだけですか?
try:
example_dict['key1']['key2']
except KeyError:
pass
get()
あるいは、Pythonにはネストされた辞書のようなメソッドがあるのでしょうか?
ベストアンサー1
2 回使用することもできますget
。
example_dict.get('key1', {}).get('key2')
またはのいずれかが存在しないNone
場合に返されます。key1
key2
存在するが辞書 (またはメソッドを持つ辞書のようなオブジェクト)ではないAttributeError
場合、依然としてエラーが発生する可能性があることに注意してください。投稿したコードでは、添え字付けできない場合に代わりにエラーが発生します。example_dict['key1']
get
try..except
TypeError
example_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')