【问题标题】:Iterate over nested keys in Python dict and break on first occurence迭代 Python dict 中的嵌套键并在第一次出现时中断
【发布时间】:2016-08-08 08:13:03
【问题描述】:

我有一个 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 时中断代码并遍历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

【问题讨论】:

    标签: python dictionary nested key


    【解决方案1】:

    你也需要从 recursive 调用中返回,并用它来通知你是否要继续循环;您的代码忽略了递归 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' 总是设置为布尔值;以上为该键的任何“真实”值返回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(我不得不稍微修改它,因为我有重复的键,我处理它的方式是我有每个重复键的值列表;))
    【解决方案2】:

    如果您使用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

    【讨论】:

      猜你喜欢
      • 2019-11-12
      • 1970-01-01
      • 2016-12-31
      • 2016-01-26
      • 2019-12-19
      • 1970-01-01
      • 2021-10-14
      • 1970-01-01
      • 2021-06-17
      相关资源
      最近更新 更多