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):
如果其中一个条目存在但不包含任何条目而不是字典,则此选项将起作用。请检查此选项: