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

Iterate over nested keys in Python dict and break on first occurence

我有一个 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,那么我想 return False。对于上面的例子,我的函数应该 return True.

基本上我想在 b1=True 第一次出现时破解代码并遍历字典的所有键(在所有级别),如果不存在这种情况,return错误。

这是我想出的:

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

我的代码总是 returns False.

您还需要从 递归 调用中 return,并使用它来通知您是否要继续循环;您的代码忽略了递归 isb1True(value) 调用 returns.

的内容

您可以使用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' 总是设置为布尔值;上述 returns True 为该键的任何 'truthy' 值。

部分测试用例:

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

如果你使用 NestedDict 它就变得简单了。

from ndicts.ndicts import NestedDict

def contains(d, k):
    nd = NestedDict(d)
    for key in nd:
        if k in key:
            return True
    return False
>>> d = {
        "a": 1,
        "b": {"b1": False,
              "b2": {"b21": 2, "b22": 8}
    }
>>> contains(d, "b1")
True
>>> contains(d, "asd")
False

安装ndictspip install ndicts