我正在尝试编写一个非常简单的函数来递归搜索可能嵌套的(在最极端的情况下十层深)Python 字典并返回它从给定键中找到的第一个值。
我不明白为什么我的代码不适用于嵌套字典。
def _finditem(obj, key):
if key in obj: return obj[key]
for k, v in obj.items():
if isinstance(v,dict):
_finditem(v, key)
print _finditem({"B":{"A":2}},"A")
它返回无
。
但是,它确实适用于 _findiitem({"B":1,"A":2},"A")
,返回 2
。
我确定这是一个简单的错误,但我找不到它。我觉得标准库或 collections
中可能已经有这方面的内容,但我也找不到。
如果您正在寻找这样的代码有什么问题的一般解释,规范是 Why does my recursive function return None? .这里的答案大多是特定于在嵌套字典中搜索的任务。
最佳答案
递归的时候需要return
_findiitem
def _finditem(obj, key):
if key in obj: return obj[key]
for k, v in obj.items():
if isinstance(v,dict):
return _finditem(v, key) #added return statement
要修复实际算法,您需要意识到 _findiitem
如果没有找到任何内容,则返回 None
,因此您需要明确检查以防止提前返回:
def _finditem(obj, key):
if key in obj: return obj[key]
for k, v in obj.items():
if isinstance(v,dict):
item = _finditem(v, key)
if item is not None:
return item
当然,如果您的任何字典中有 None
值,这将失败。在这种情况下,您可以为此函数设置一个哨兵 object()
并在您没有找到任何东西的情况下返回它 - 然后您可以检查 sentinel
知道你是否发现了什么。
关于python - 在字典中递归查找键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14962485/