Проверить вложенные значения словаря?
Для большого списка вложенных словарей я хочу проверить, содержат ли они ключ или нет. Каждый из них может иметь или не иметь один из вложенных словарей, поэтому, если я зациклирую этот поиск по всем ним, возникает ошибка:
for Dict1 in DictionariesList:
if "Dict4" in Dict1['Dict2']['Dict3']:
print "Yes"
Мое решение до сих пор:
for Dict1 in DictionariesList:
if "Dict2" in Dict1:
if "Dict3" in Dict1['Dict2']:
if "Dict4" in Dict1['Dict2']['Dict3']:
print "Yes"
Но это головная боль, уродливые и, вероятно, не очень эффективные ресурсы. Какой был бы правильный способ сделать это в моделях первого типа, но без повышения ошибки, когда словарь не существует?
Ответы
Ответ 1
Используйте .get()
с пустыми словарями по умолчанию:
if 'Dict4' in Dict1.get('Dict2', {}).get('Dict3', {}):
print "Yes"
Если ключ Dict2
отсутствует, возвращается пустой словарь, поэтому следующий связанный .get()
также не найдет Dict3
и вернет пустой словарь по очереди. Затем in
тесте возвращается False
.
Альтернативой является просто перехват KeyError
:
try:
if 'Dict4' in Dict1['Dict2']['Dict3']:
print "Yes"
except KeyError:
print "Definitely no"
Ответ 2
Как насчет блока try/except:
for Dict1 in DictionariesList:
try:
if 'Dict4' in Dict1['Dict2']['Dict3']:
print 'Yes'
except KeyError:
continue # I just chose to continue. You can do anything here though
Ответ 3
Здесь обобщение для произвольного числа ключей:
for Dict1 in DictionariesList:
try: # try to get the value
reduce(dict.__getitem__, ["Dict2", "Dict3", "Dict4"], Dict1)
except KeyError: # failed
continue # try the next dict
else: # success
print("Yes")
На основе Python: изменение значений в dict вложенных dicts с использованием элементов в списке.