在字典中递归查找键

发布于 2021-01-29 17:24:14

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

关注者
0
被浏览
41
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    当你递归,你需要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以确定是否找到了东西。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看