在字典中递归查找键
我正在尝试编写一个非常简单的函数,以递归方式搜索可能嵌套的(在最极端的情况下为十层深度)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
以确定是否找到了东西。