我有一个JSON dict,如下所示:
"{
"a":1,
"b":{
"b1":False,
"b2":{"b21": 2, "b22":8}
},
"c": {
"b1":True,
"b2":2,
"b4":8
},
"d":{
"b1":False,
"d1":89
}
}"
我想检查字典中的键"b1"
的值,并在找到b1=True
时离开。如果我检查整个dict(包括嵌套键),并且我没有找到b1 = True,那么我想返回False。对于上面的例子,我的函数应该返回True。
基本上我想在第一次出现b1=True
时破坏代码并迭代dict的所有键(在所有级别中),如果这种情况不存在,则返回False。
这就是我提出的:
def isb1True(jsonDoc):
found = False
for (key,value) in jsonDoc.iteritems():
if key=='b1':
if value==True :
found=True
break
else:
isb1True(value)
return found
我的代码总是返回False
。
答案 0 :(得分:4)
您也需要从递归调用返回,并使用它来告知是否继续循环;您的代码忽略了递归isb1True(value)
调用返回的内容。
您可以使用any()
function来短路测试递归值:
def isb1true(d):
if not isinstance(d, dict): return False
return any(v if k == 'b1' else isb1true(v) for k, v in d.iteritems())
以上对任何非'b1'
的密钥进行递归,并且当该值不是字典时递归停止(在这种情况下,它不会是b1
,因此结果不是'b1': True
1}} case)。
我假设'b1'
始终设置为布尔值;对于该密钥的任何“真实”值,上面的内容都会返回True
。
一些测试用例:
>>> isb1true({'b1': True})
True
>>> isb1true({'b1': False})
False
>>> isb1true({'b': {'b1': True}})
True
>>> isb1true({'b': {'b1': False}})
False
>>> isb1true({'b': {'c': True, 'spam': 'eggs', 'ham': {'bar': 'baz', 'b1': True}}})
True
>>> isb1true({'b': {'c': True, 'spam': 'eggs', 'ham': {'bar': 'baz'}}})
False