我有几个嵌套的字典在列表中,我需要验证是否存在特定路径,例如:
dict1['layer1']['layer2'][0]['layer3']
如何使用IF语句检查路径是否有效?
我在思考要
if dict1['layer1']['layer2'][0]['layer3'] :
但它不起作用。
我有几个嵌套的字典在列表中,我需要验证是否存在特定路径,例如:
dict1['layer1']['layer2'][0]['layer3']
如何使用IF语句检查路径是否有效?
我在思考要
if dict1['layer1']['layer2'][0]['layer3'] :
这是完整的带有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
dict1['layer1']['layer2']
是一个空列表,那么您将会得到IndexError: list index out of range
的错误。将except KeyError
替换为except (KeyError, IndexError)
可以解决这个问题。 - undefined我想提出另一种解决方案,因为我也在思考这个问题。
if not dict1.get("layer1", {}).get("layer2", {})[0].get("layer3", {}):
...
dict.get()
会尝试获取每个阶段的键。如果没有找到该键,则返回一个空字典,而不是嵌套字典(这是必要的,因为在默认返回None的情况下调用.get()将导致 AttributeError
)。如果返回值为空,则将其评估为false。因此,如果最终结果本来就是一个空字典,那么这种方法就行不通了,但是如果您可以保证结果将被填充,那么这是一种相当简单的替代方案。
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 Zhangif 'layer1' in dict1:
if 'layer2' in dict1['layer1']
等等...
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是表示嵌套键的字符串列表。