迭代 Python 字典中的嵌套键并在第一次出现时中断
Iterate over nested keys in Python dict and break on first occurence
我有一个 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,那么我想 return False。对于上面的例子,我的函数应该 return True.
基本上我想在 b1=True
第一次出现时破解代码并遍历字典的所有键(在所有级别),如果不存在这种情况,return错误。
这是我想出的:
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
我的代码总是 returns False
.
您还需要从 递归 调用中 return,并使用它来通知您是否要继续循环;您的代码忽略了递归 isb1True(value)
调用 returns.
的内容
您可以使用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'
总是设置为布尔值;上述 returns True
为该键的任何 'truthy' 值。
部分测试用例:
>>> 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
如果你使用 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
我有一个 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,那么我想 return False。对于上面的例子,我的函数应该 return True.
基本上我想在 b1=True
第一次出现时破解代码并遍历字典的所有键(在所有级别),如果不存在这种情况,return错误。
这是我想出的:
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
我的代码总是 returns False
.
您还需要从 递归 调用中 return,并使用它来通知您是否要继续循环;您的代码忽略了递归 isb1True(value)
调用 returns.
您可以使用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'
总是设置为布尔值;上述 returns True
为该键的任何 'truthy' 值。
部分测试用例:
>>> 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
如果你使用 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