为了账号安全,请及时绑定邮箱和手机立即绑定

在字典中递归查找键

在字典中递归查找键

慕的地8271018 2019-10-21 09:49:37
我正在尝试编写一个非常简单的函数,以递归方式搜索可能嵌套的(在最极端的情况下为十层深度)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")return 起作用2。我敢肯定这是一个简单的错误,但我找不到。我觉得标准库或中可能已经有此功能collections,但是我也找不到。
查看完整描述

3 回答

?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

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


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


查看完整回答
反对 回复 2019-10-21
?
HUH函数

TA贡献1836条经验 获得超4个赞

这是使用“堆栈”和“迭代器堆栈”模式进行操作的一种方法(归功于Gareth Rees):


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。


查看完整回答
反对 回复 2019-10-21
  • 3 回答
  • 0 关注
  • 624 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号