我有一个像下面这样的 JSON 字典:
"{
"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
就退出。如果我检查整个字典(包括嵌套键),但没有找到 b1=True,那么我想返回 False。对于上面的示例,我的函数应该返回 True。
基本上,我想在第一次出现 b1=True
时打破代码并遍历字典的所有键(在所有级别),如果不存在这种情况,则返回 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
。
您还需要从递归 调用中返回,并使用它来通知您是否要继续循环;您的代码忽略了递归 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
情况)。
我假设 'b1'
总是设置为 bool 值;对于该键的任何“真实”值,以上代码返回 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
我是一名优秀的程序员,十分优秀!