在Python dict中的嵌套键上迭代,并在第一次出现时中断
我有一个JSON dict,如下所示:在Python dict中的嵌套键上迭代,并在第一次出现时中断,python,dictionary,nested,key,Python,Dictionary,Nested,Key,我有一个JSON dict,如下所示: "{ "a":1, "b":{ "b1":False, "b2":{"b21": 2, "b22":8} }, "c":
"{
"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。您也需要从递归调用返回,并使用它来通知您是否要继续循环;您的代码忽略递归isb1Truevalue调用返回的内容 您可以使用短路测试递归值:
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”:真实情况
我假设'b1'总是设置为布尔值;对于该键的任何“truthy”值,以上返回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
您也需要从递归调用返回,并使用它来通知您是否将继续循环;您的代码忽略递归isb1Truevalue调用返回的内容 您可以使用短路测试递归值:
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”:真实情况
我假设'b1'总是设置为布尔值;对于该键的任何“truthy”值,以上返回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
非常感谢。这解决了我的问题:D我必须稍微修改它,因为我有重复的键,我处理它的方式是,我有一个列表的值为每个重复的键;非常感谢。这解决了我的问题:D我必须稍微修改它,因为我有重复的键,我处理它的方式是,我有一个列表的值为每个重复的键;