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

09-11 18:58
查看更多