Skip to main content
 首页 » 编程设计

python之遍历 Python 字典中的嵌套键并在第一次出现时中断

2025年05月04日26lyhabc

我有一个像下面这样的 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