[解決済み】ネストした辞書の値を安全に取得する方法
質問
ネストされた辞書があります。安全に値を取り出す方法は1つしかないのでしょうか?
try:
example_dict['key1']['key2']
except KeyError:
pass
あるいは、pythonに以下のようなメソッドがあるかもしれません。
get()
ネストされた辞書のために?
どのように解決するのですか?
を使用することができます。
get
を2回実行します。
example_dict.get('key1', {}).get('key2')
これは
None
のどちらかであれば
key1
または
key2
は存在しない。
を発生させる可能性があることに注意してください。
AttributeError
もし
example_dict['key1']
は存在するが、ディクト(またはディクトに似たオブジェクトで
get
メソッド) を使用します。また
try..except
が発生します。
TypeError
の場合、代わりに
example_dict['key1']
は添え字なしとする。
もう一つの違いは
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
. 同じメソッドと構文が使えますが、ハッシャーは見つからないキーの扱いが異なるだけです。
通常の
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')
関連
-
[解決済み】「RuntimeError: dictionary changed size during iteration」エラーを回避する方法とは?
-
[解決済み] 辞書を値で並べ替えるにはどうしたらいいですか?
-
[解決済み] Pythonで辞書に新しいキーを追加するにはどうすればよいですか?
-
[解決済み] 与えられたキーがすでに辞書に存在するかどうかをチェックする
-
[解決済み] Python 3で「1000000000000000 in range(1000000000000001)」はなぜ速いのですか?
-
[解決済み] Pythonで文字列の部分文字列を取得するにはどうすればよいですか?
-
[解決済み] モジュールの関数名(文字列)を使って、モジュールの関数を呼び出す。
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み】Pythonで辞書のキーをリストとして返すには?
-
[解決済み】2つの辞書を1つの式でマージする(辞書の和をとる)には?)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
ピロウズ画像色処理の具体的な活用方法
-
Pythonコンテナのための組み込み汎用関数操作
-
Python Decorator 練習問題
-
Python 可視化 big_screen ライブラリ サンプル 詳細
-
PythonによるExcelファイルの一括操作の説明
-
FacebookオープンソースワンストップサービスpythonのタイミングツールKats詳細
-
[解決済み】TypeErrorの修正方法。Unicodeオブジェクトは、ハッシュ化する前にエンコードする必要がある?
-
[解決済み】OSError: [WinError 193] %1 は有効な Win32 アプリケーションではありません。
-
[解決済み] キーのリストを介してネストされた辞書アイテムにアクセスしますか?
-
[解決済み】ネストされた辞書を実装するのに最適な方法は?