假设我有一个嵌套的词典,例如以下
{'agent1': {'status': True},
'block1': {'status': True, 'number': False, 'usable_by': True, 'location': True, 'skill':
{'speed': False, 'flexibility': True}}}
在此dict的最低键级别(叶子),值只是布尔值(True或False)。输入字典基本上可以有任何类型的嵌套结构,不同的名称作为键,没有固定的深度。
我如何检查一般情况下,某个字典中是否有False
。
答案 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()
function和generator 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)
希望这有帮助。