Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python dict中的嵌套键上迭代,并在第一次出现时中断_Python_Dictionary_Nested_Key - Fatal编程技术网

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

在Python dict中的嵌套键上迭代,并在第一次出现时中断,python,dictionary,nested,key,Python,Dictionary,Nested,Key,我有一个JSON dict,如下所示: "{ "a":1, "b":{ "b1":False, "b2":{"b21": 2, "b22":8} }, "c":

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

您也需要从递归调用返回,并使用它来通知您是否要继续循环;您的代码忽略递归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我必须稍微修改它,因为我有重复的键,我处理它的方式是,我有一个列表的值为每个重复的键;