Python 检查嵌套字典键是否存在

Python 检查嵌套字典键是否存在,python,dictionary,Python,Dictionary,因此,基本上我正在遍历嵌套字典扩展,如下所示: extension['value1']['value2']['value3']['value4'] 但是,有时dict文件可能有点不同: extension['value1']['value2']['blah1']['value4'] 我如何解释这种情况?我不必担心大量的场景,键只会是value3或blah1您必须明确检查键,然后获取其值。例如: optional_keys = ['value3', 'blah1'] value = None

因此,基本上我正在遍历嵌套字典
扩展
,如下所示:

extension['value1']['value2']['value3']['value4']
但是,有时dict文件可能有点不同:

extension['value1']['value2']['blah1']['value4']

我如何解释这种情况?我不必担心大量的场景,键只会是
value3
blah1

您必须明确检查
键,然后获取其值。例如:

optional_keys = ['value3', 'blah1']
value = None

for optional_key in optional_keys:
    if optional_key in extension['value1']['value2']:
         value = extension['value1']['value2'][optional_key]['value4']
         break

必须显式检查
,然后获取其值。例如:

optional_keys = ['value3', 'blah1']
value = None

for optional_key in optional_keys:
    if optional_key in extension['value1']['value2']:
         value = extension['value1']['value2'][optional_key]['value4']
         break

您可以编写一个函数来获取存在的第一个密钥:

def get_first_item(items, keys):
    for k in keys:
        if k in items:
            return items[k]

    raise KeyError
然后像这样使用它:

get_first_item(extension['value1']['value2'], ['value3', 'blah1'])['value4']

您可以编写一个函数来获取存在的第一个密钥:

def get_first_item(items, keys):
    for k in keys:
        if k in items:
            return items[k]

    raise KeyError
然后像这样使用它:

get_first_item(extension['value1']['value2'], ['value3', 'blah1'])['value4']

我认为以上两个答案可以很好地解决你的问题。由于您的键将是
value3
blah1
,而不是函数,因此在循环浏览字典时也可以使用以下代码:

try:
    value = extension['value1']['value2']['value3']['value4']
except Exception as e:  # except KeyError:
    # print(e)
    value = extension['value1']['value2']['blah1']['value4']

我认为以上两个答案可以很好地解决你的问题。由于您的键将是
value3
blah1
,而不是函数,因此在循环浏览字典时也可以使用以下代码:

try:
    value = extension['value1']['value2']['value3']['value4']
except Exception as e:  # except KeyError:
    # print(e)
    value = extension['value1']['value2']['blah1']['value4']

考虑到只有两个键可能会变化,它会起作用。考虑到只有两个键可能会变化,它会起作用。谢谢,你们两个基本上是在同一时间发布的,所以我不得不接受一个,我去了Ryans,因为它看起来更直观。不过,我很欣赏大家的反应,有不同的方法总是很好:)谢谢,你们两个基本上是在同一时间发布的,所以我不得不接受一个,我选择了Ryans,因为它看起来更直观一些。尽管如此,我还是很欣赏大家的反应,有不同的方法总是好的:)