假设我们有一个字典列表listD,其中每个字典都与更多的字典嵌套在一起。e、 g.假设listD的第一个元素是:
listD[0] = {"bar1":{"bar2":{"bar3":1234}}}
现在我想检查listD[I][“bar1”][“bar2”][“bar3”]==1234,对于I=0的第一个元素,这很简单,因为我们可以使用表达式:
^{pr2}$但我不能简单地写一个循环:
for dictelem in listD:
if dictelem["bar1"]["bar2"]["bar3"] == 1234:
print "equals 1234"
这是因为listD的一些dictionary元素的形式可能是
listD[i] = {"bar1":{"bar2":"abcd"}} or
listD[i] = {"bar1":{"bar2":None}}
如果我试图在“bar3”不存在的时候访问它,就会产生一个错误。在
现在我在代码中手动指定以检查是否存在bar1、bar2和bar3键,以及这些键是否是字典。但这真的很冗长,我很确定有更简单的方法来做,但我不知道怎么做。在
传递一个dict
^{pr2}$d
,一个键路径p
,以及要检查v
的最终值。它将递归地进入dicts,最后检查最后一个值是否等于v
。在所以,为了回答您的问题(我想检查一下listD[I][“bar1”][“bar2”][“bar3”]==1234所有I):
在处理嵌套字典时,我认为它们是一个树,其中键构成了值的路径。考虑到这一点,我创建了一个非递归函数
dict_path
,它接受一个嵌套字典、密钥路径和一个值以防找不到:函数将继续遍历嵌套字典,直到出现以下三种情况之一:
KeyError
TypeError
对于情况2和3,我们只返回
value_if_not_found
只需按如下方式使用
try/except
块:相关问题 更多 >
编程相关推荐