在Python dict中迭代嵌套键并在第一次出现时中断

时间:2016-08-08 08:13:04

标签: python dictionary nested key

我有一个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

1 个答案:

答案 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