我正在尝试编写一个非常简单的函数,以递归方式搜索可能嵌套的(在最极端的情况下为十层深度)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")
它返回
None
。但是,它对于
_finditem({"B":1,"A":2},"A")
确实有效,返回2
。我敢肯定这是一个简单的错误,但我找不到。我觉得标准库或
collections
中可能已经有此功能,但是我也找不到。 最佳答案
递归时,您需要return
_finditem
的结果
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
要修复实际算法,您需要意识到
_finditem
如果找不到任何内容,则返回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
来检查是否找到了某些内容。