Проверить вложенные значения словаря?

Для большого списка вложенных словарей я хочу проверить, содержат ли они ключ или нет. Каждый из них может иметь или не иметь один из вложенных словарей, поэтому, если я зациклирую этот поиск по всем ним, возникает ошибка:

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