[解決済み] ネストされたキーがdictに存在するかどうかをチェックするエレガントな方法?
2022-10-21 12:59:25
質問
各レベルを個別にチェックすることなく、dictに埋もれているキーが存在するかどうかをチェックする、より読みやすい方法はありますか?
埋もれているオブジェクトの中のこの値を取得する必要があるとします(Wikidataから取得した例)。
x = s['mainsnak']['datavalue']['value']['numeric-id']
これがランタイムエラーで終わらないようにするためには、このようにすべてのレベルをチェックする必要があります。
if 'mainsnak' in s and 'datavalue' in s['mainsnak'] and 'value' in s['mainsnak']['datavalue'] and 'nurmeric-id' in s['mainsnak']['datavalue']['value']:
x = s['mainsnak']['datavalue']['value']['numeric-id']
これを解決するために私が思いつく他の方法は、これを
try catch
の構成にすることですが、これもこのような単純なタスクとしてはかなり厄介だと感じています。
私はこのようなものを探しています。
x = exists(s['mainsnak']['datavalue']['value']['numeric-id'])
を返します。
True
を返します。
どのように解決するのですか?
簡単に説明すると、Pythonでは、信頼する必要があるのは 許可を得るより、許しを得る方が簡単です。
try:
x = s['mainsnak']['datavalue']['value']['numeric-id']
except KeyError:
pass
回答
ここでは、ネストしたdictキーに対処する方法を説明します。
def keys_exists(element, *keys):
'''
Check if *keys (nested) exists in `element` (dict).
'''
if not isinstance(element, dict):
raise AttributeError('keys_exists() expects dict as first argument.')
if len(keys) == 0:
raise AttributeError('keys_exists() expects at least two arguments, one given.')
_element = element
for key in keys:
try:
_element = _element[key]
except KeyError:
return False
return True
例
data = {
"spam": {
"egg": {
"bacon": "Well..",
"sausages": "Spam egg sausages and spam",
"spam": "does not have much spam in it"
}
}
}
print 'spam (exists): {}'.format(keys_exists(data, "spam"))
print 'spam > bacon (do not exists): {}'.format(keys_exists(data, "spam", "bacon"))
print 'spam > egg (exists): {}'.format(keys_exists(data, "spam", "egg"))
print 'spam > egg > bacon (exists): {}'.format(keys_exists(data, "spam", "egg", "bacon"))
出力します。
spam (exists): True
spam > bacon (do not exists): False
spam > egg (exists): True
spam > egg > bacon (exists): True
与えられた
element
をループし、与えられた順番で各キーをテストします。
私は、すべての
variable.get('key', {})
メソッドに続くものであるため、私が見つけた
EAFP
.
のように呼び出されることを除いた関数です。
keys_exists(dict_element_to_test, 'key_level_0', 'key_level_1', 'key_level_n', ..)
. 少なくとも2つの引数、要素と1つのキーが必要ですが、好きなだけキーを追加することができます。
もし、kind of mapを使う必要がある場合は、以下のような方法があります。
expected_keys = ['spam', 'egg', 'bacon']
keys_exists(data, *expected_keys)
関連
-
[解決済み] JavaScriptのオブジェクトにキーが存在するかどうかをチェックする?
-
[解決済み] 与えられたキーがすでに辞書に存在するかどうかをチェックする
-
[解決済み] JavaScriptで変数が存在するか(定義されているか/初期化されているか)をチェックする
-
[解決済み] Pythonで型をチェックする標準的な方法は何ですか?
-
[解決済み] 変数が存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] リストに値が存在するかどうかを確認する最速の方法
-
[解決済み] なぜdict[key]ではなく、dict.get(key)なのか?
-
[解決済み] ネストされたPythonのdictをオブジェクトに変換する?
-
[解決済み] Pythonで0xを使わずにhex()を使うには?
-
[解決済み] Jupyter (IPython)ノートブックのセッションをpickleして保存する方法
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 前月の日時オブジェクトを返す
-
[解決済み] Jupyterノートブックでenv変数を設定する方法
-
[解決済み] バブルソートの宿題
-
[解決済み] 小数点以下1桁を取得する[重複]。
-
[解決済み] SQLAlchemy: 日付フィールドをフィルタリングする方法は?
-
[解決済み] データフレームをソートした後にインデックスを更新する
-
[解決済み] オブジェクトのリストに特定の属性値を持つオブジェクトが含まれているかどうかをチェックする
-
[解決済み] Pythonによる一対のクロスプロダクト [重複] (英語)
-
[解決済み] PySparkでデータフレームのカラムをString型からDouble型に変更する方法は?
-
[解決済み] djangoのQueryDictをPythonのDictに変更するには?