检查python中叶子节点中嵌套的dict是否为False

时间:2016-08-06 14:17:17

标签: python dictionary nested

假设我有一个嵌套的词典,例如以下

{'agent1': {'status': True}, 
 'block1': {'status': True, 'number': False, 'usable_by': True, 'location': True, 'skill':
                {'speed': False, 'flexibility': True}}}

在此dict的最低键级别(叶子),值只是布尔值(True或False)。输入字典基本上可以有任何类型的嵌套结构,不同的名称作为键,没有固定的深度。

我如何检查一般情况下,某个字典中是否有False

3 个答案:

答案 0 :(得分:1)

要遍历嵌套的dict,可以使用递归。见(Loop through all nested dictionary values?

def contains_false(d):
    for k,v in d.iteritems():
        if isinstance(v, dict):
            # recurse into nested-dict
            if contains_false(v):
                return True

        # Check value of leaf-node. Exit early
        # if we find a 'False' value.
        if v is False:
            return True

   # no 'False' values found
   return False

>>> d = {1:True, 2:{1:True, 2:True}, 3:{1:True, 2:True, 3:{1:False}}}
>>> contains_false(d)
True
>>> d[3][3][1] = True
>>> contains_false(d)
False

这假设你不需要知道要到达“假”的密钥。值。

答案 1 :(得分:1)

您必须遍历字典,并且想要提前退出

def any_false_leaf(d):
    if isinstance(d, dict):
        return any(any_false_leaf(v) for v in d.values())
    return not d

通过字典递归,如果结构中存在嵌套的false值,则返回True。使用any() functiongenerator expression可确保在找到此值后立即生成结果。

演示:

>>> d = {'agent1': {'status': True},
...  'block1': {'status': True, 'number': False, 'usable_by': True, 'location': True, 'skill':
...                 {'speed': False, 'flexibility': True}}}
>>> any_false_leaf(d)
True
>>> any_false_leaf({'foo': True})
False
>>> any_false_leaf({'foo': {'bar': True}})
False
>>> any_false_leaf({'foo': {'bar': True, 'spam': False}})
True

答案 2 :(得分:0)

快速解决方案可以是:

d = {'block1': {'status': True, 'usable_by': True, 'skill': {'flexibility': True, 'speed': False}, 'number': False, 'location': True}, 'agent1': {'status': True}}

values = []

def find_false(d):
    for k in d.keys():
        if isinstance(d[k], dict):
            find_false(d[k])
        else:
            values.append(d[k])

find_false(d)
print(False in values)

希望这有帮助。

相关问题