python - 在字典中递归查找键

标签 python search recursion dictionary

我正在尝试编写一个非常简单的函数来递归搜索可能嵌套的(在最极端的情况下十层深)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/

相关文章:

java - 递归搜索二叉树问题

algorithm - 如何解决这个汉诺塔变体

python - MATLAB 生成的 Python 包与 Ubuntu 上的 PyQt5 冲突——可能是库问题

python - 按行拆分数组

java - 按多个条件搜索/过滤 ListView

MySQL 全文搜索匹配相似结果

algorithm - 递归谜题

c++ - 程序如何打印 10 条语句?

python - 使用带有多个映射函数的 pandas applymap()

python - 如何将此列表转换为字典