Python中是否有字典元素的干净测试?
如果我试图从字典中获取一个元素:Python中是否有字典元素的干净测试?,python,dictionary,lookup,Python,Dictionary,Lookup,如果我试图从字典中获取一个元素: my_dict[i]['level_1']['level_2']['my_var'] 有没有比这更干净的方法来检查空值 if 'level_1' in my_dict[i]: if 'level_2' in my_dict[i]['level_1']: if 'my_var' in my_dict[i]['level_1']['level_2']: my_var = my_dict[i]['level_1']['l
my_dict[i]['level_1']['level_2']['my_var']
有没有比这更干净的方法来检查空值
if 'level_1' in my_dict[i]:
if 'level_2' in my_dict[i]['level_1']:
if 'my_var' in my_dict[i]['level_1']['level_2']:
my_var = my_dict[i]['level_1']['level_2']['my_var']
您可以简单地定义自己的:
def get_deep(dic,*keys,default=None):
for key in keys:
if isinstance(dic,dict) and key in dic:
dic = dic[key]
else:
return default
return dic
或者,如果要测试:
def in_deep(dic,*keys):
for key in keys:
if isinstance(dic,dict) and key in dic:
dic = dic[key]
else:
return False
return True
您可以将此代码与一起使用(my_dict[i]、'level1'、'level2'、'my_var')
,如果它确实可以在字典中找到那么深的位置,它将返回True
。如果您想获得如此深的元素,可以调用get_deep(my_dict[i]、'level1'、'level2'、'my_var')
get_deep
将返回default
参数(默认情况下None
),以防它无法到达路径。以下是我的一行代码:
# returns False or the value of the end element
reduce(lambda x, y: x and y in x and x[y], list_of_keys, target_dictionary)
例如:
a = {'b': {'c': {'d': True}}}
reduce(lambda x, y: x and y in x and x[y], ['b', 'c', 'd'], a) # True
reduce(lambda x, y: x and y in x and x[y], ['b', 'cd', 'd'], a) # False
工作原理:在reduce的每次迭代中,它都会检查previouis键是否在目标字典中(x
)。如果没有,它将立即返回False,因为和
条件,并将其传播到列表中。然后,它将检查请求的密钥是否在dict中(x in y
)。如果是,它会将较低级别的字典作为x
传递到较低级别
注意:最后一个元素(a['b']['c']['d'])必须计算为True。如果您希望最后为False,请明确检查最后一级:
'd'在reduce(…)
您可以使用dict.get
-my_dict[i].get('level_1',{}).get('level_2',{}.get('my_var')
。如果找不到,它将是None
。或者try except KeyError
block您在这里的方法将完全取决于您试图实现的目标和您想要的行为。一个简单的my_var=my_dict[i]['level_1']['level_2']['my_var']
包装在try except
中,或者jonsharpe建议的方法,这取决于您数据的性质。@Ev.Kounis可能except(keyrerror,TypeError):
如果其中一个条目存在但不包含任何条目而不是字典,则此选项将起作用。请检查此选项: