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

4

我有几个嵌套的字典在列表中,我需要验证是否存在特定路径,例如:

dict1['layer1']['layer2'][0]['layer3']

如何使用IF语句检查路径是否有效?

我在思考要

if dict1['layer1']['layer2'][0]['layer3'] :

但它不起作用。

2
一种方法是“宁可请求原谅,而不是事先检查是否存在”。 - roganjosh
所以,你尝试着遵循这个路径,并假设它总是存在的,除非它不存在。 - ForceBru
我试图将路径中的值赋给一个变量,但是它失败了并返回了一个错误(KeyError: 'media')。 - Luigi T.
6个回答

6

这是完整的带有try/except的代码:

try:
    dict1['layer1']['layer2'][0]['layer3']
except KeyError:
    present = False
else:
    present = True

if present: 
    ...

获取元素:
try:
    obj = dict1['layer1']['layer2'][0]['layer3']
except KeyError:
    obj = None  # or whatever

1
请注意,如果dict1['layer1']['layer2']是一个空列表,那么您将会得到IndexError: list index out of range的错误。将except KeyError替换为except (KeyError, IndexError)可以解决这个问题。 - undefined

2

我想提出另一种解决方案,因为我也在思考这个问题。

if not dict1.get("layer1", {}).get("layer2", {})[0].get("layer3", {}):
    ...

dict.get() 会尝试获取每个阶段的键。如果没有找到该键,则返回一个空字典,而不是嵌套字典(这是必要的,因为在默认返回None的情况下调用.get()将导致 AttributeError)。如果返回值为空,则将其评估为false。因此,如果最终结果本来就是一个空字典,那么这种方法就行不通了,但是如果您可以保证结果将被填充,那么这是一种相当简单的替代方案。


在我看来,最佳解决方案是: - Yost777

1
如果你不想使用 try/except 的方法,你可以快速地编写一个方法来完成这个任务:
def check_dict_path(d, *indices):
    sentinel = object()
    for index in indices:
        d = d.get(index, sentinel)
        if d is sentinel:
            return False
    return True


test_dict = {1: {'blah': {'blob': 4}}}

print check_dict_path(test_dict, 1, 'blah', 'blob') # True
print check_dict_path(test_dict, 1, 'blah', 'rob') # False

这可能是多余的,如果你也想在那个位置检索对象(而不仅仅是验证位置是否存在)。如果是这种情况,上述方法可以轻松地相应更新。

ه°†return Falseو›´و”¹ن¸؛yield Falseه°†ه¤§è‡´وڈگهچ‡و€§èƒ½40%م€‚ - Shawn Zhang

0

0
据我所知,你必须一步一步地进行,也就是说:
if 'layer1' in dict1:
   if 'layer2' in dict1['layer1']

等等...


0
使用递归函数:
def path_exists(path, dict_obj, index = 0):
    if (type(dict_obj) is dict and path[index] in dict_obj.keys()):
        if (len(path) > (index+1)):
            return path_exists(path, dict_obj[path[index]], index + 1)
        else:
            return True
    else:
        return False

其中path是表示嵌套键的字符串列表。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接