Python 检查嵌套字典中是否存在False as值

Python 检查嵌套字典中是否存在False as值,python,dictionary,Python,Dictionary,在Python嵌套字典中的任何地方,都有一种简单的方法来查找FalseAS值的出现。我当然可以循环使用键和值,但是,也许有更好的方法,特别是当我们不知道嵌套字典的深度时 下面的示例dictionary应该返回False,因为有一次出现False {'metric1': {'details': {'baseline': {'actual': 1, 'lower_bound': 1,

在Python嵌套字典中的任何地方,都有一种简单的方法来查找FalseAS值的出现。我当然可以循环使用键和值,但是,也许有更好的方法,特别是当我们不知道嵌套字典的深度时

下面的示例dictionary应该返回False,因为有一次出现False

{'metric1': {'details': {'baseline': {'actual': 1,
                                      'lower_bound': 1,
                                      'result': True,
                                      'upper_bound': 2}},
             'result': True},
 'metric2': {'details': {'baseline': {'actual': 0,
                                      'lower_bound': 1,
                                      'result': False,
                                      'upper_bound': 2}},
             'result': None},
 'metricbool': {'details': None, 'result': True}}

您可以将
all
与递归一起使用:

def has_true(d):
   return all(has_true(i) and ('result' not in i or i['result']) if isinstance(i, dict) else True for i in d.values())

data = {'metric1': {'details': {'baseline': {'actual': 1, 'lower_bound': 1, 'result': True, 'upper_bound': 2}}, 'result': True}, 'metric2': {'details': {'baseline': {'actual': 0, 'lower_bound': 1, 'result': False, 'upper_bound': 2}}, 'result': True}, 'metricbool': {'details': None, 'result': True}} 
print(has_true(data))
输出:

False

一个也许很有趣的黑客:

import sys, copy

def contains_False(obj):
    r0 = sys.getrefcount(False)
    _ = copy.deepcopy(obj)
    r1 = sys.getrefcount(False)
    return r1 > r0

字典没有反向查找功能,所以在内容中循环是唯一的选择。一种方法是,然后在列表中的值上循环。但最终,这也只是一个循环。它只是使处理未知嵌套结构变得容易。False是否总是出现在
'result'
条目中?除了给定的示例之外,还有其他嵌套字典吗?有了这些信息,你可以编写出最有效的搜索模式,但是没有通用的方法来搜索没有循环或理解的任意嵌套字典。。。这是一个很好的方法,我会复制并粘贴这个答案,但是OP确实指定了,而没有循环键和值。@MatBailie我认为可以假设用户在更浅的输入字典的上下文中指的是“循环”。嵌套结构不能单独通过循环轻松遍历。当然,
map
也可以使用,请参见我的编辑。我对@Alax1234的这种方法很满意。您的解决方案在我的数据集上总是返回False(即使“result”的值在所有情况下都为True)。如果你能在回答中解决这个问题,我很乐意接受。@GauravPathak我更新了解决方案,使它只检查键为
“result”
的值,为什么
有true(data)
返回
False
,即使
数据有很多
true
?问题是关于寻找
,不是吗?