首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在字典中递归查找键

在字典中递归查找键
EN

Stack Overflow用户
提问于 2013-02-20 00:29:21
回答 7查看 72.5K关注 0票数 40

我正在尝试编写一个非常简单的函数来递归地搜索可能嵌套的(在最极端的情况下是十层深) Python字典,并返回它从给定键中找到的第一个值。

我不明白为什么我的代码不适用于嵌套字典。

代码语言:javascript
复制
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

但是,它确实适用于返回2_finditem({"B":1,"A":2},"A")

我确定这是一个简单的错误,但我找不到。我觉得在标准库或collections中可能已经有了这方面的东西,但我也找不到。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2013-02-20 00:30:34

当您递归时,需要对_finditem的结果执行return

代码语言:javascript
复制
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,因此您需要显式检查以防止提前返回:

代码语言:javascript
复制
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,以了解您是否找到了什么东西。

票数 66
EN

Stack Overflow用户

发布于 2013-11-28 07:06:02

这是一个搜索包含嵌套字典和列表的字典的函数。它会创建一个结果值列表。

代码语言:javascript
复制
def get_recursively(search_dict, field):
    """
    Takes a dict with nested lists and dicts,
    and searches all dicts for a key of the field
    provided.
    """
    fields_found = []

    for key, value in search_dict.iteritems():

        if key == field:
            fields_found.append(value)

        elif isinstance(value, dict):
            results = get_recursively(value, field)
            for result in results:
                fields_found.append(result)

        elif isinstance(value, list):
            for item in value:
                if isinstance(item, dict):
                    more_results = get_recursively(item, field)
                    for another_result in more_results:
                        fields_found.append(another_result)

    return fields_found
票数 32
EN

Stack Overflow用户

发布于 2017-04-03 20:37:09

下面是一个使用“堆栈”和"stack of iterators" pattern (归功于Gareth Rees)的方法:

代码语言:javascript
复制
def search(d, key, default=None):
    """Return a value corresponding to the specified key in the (possibly
    nested) dictionary d. If there is no item with that key, return
    default.
    """
    stack = [iter(d.items())]
    while stack:
        for k, v in stack[-1]:
            if isinstance(v, dict):
                stack.append(iter(v.items()))
                break
            elif k == key:
                return v
        else:
            stack.pop()
    return default

print(search({"B": {"A": 2}}, "A"))将打印2

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14962485

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档