在字典循环中中断

0 投票
1 回答
1779 浏览
提问于 2025-04-18 17:12

我有一个函数,它会遍历一个JSON对象。这个对象有时候会以几种不同的格式返回,而我需要找到一个特定的键,并打印出它的值。而且,有时候我需要的那个键会出现多次。所以,我只想打印第一个出现的值。我试过用break语句,但好像不太管用。你们觉得这是什么原因呢?

def deep(o):
    for k, v in o.iteritems():
        if k.lower() == 'key_i_look_for':
            print v
            break
        elif type(v) is dict:
            deep(o[k])
        elif type(v) is list:
            for i in v:
                if type(i) is dict:
                    deep(i)

1 个回答

2

虽然 break 这个命令可以正常工作,但你在处理一个嵌套结构时并没有返回任何结果。你忽略了外层调用中的递归搜索;如果其中一个找到目标键,后面的递归调用还是会继续执行。

你需要把递归调用的结果也返回,并且要考虑到有些搜索可能找不到任何东西(返回 None):

def deep(o):
    for k, v in o.iteritems():
        if k.lower() == 'key_i_look_for':
            return v
        if not isinstance(v, list):
            v = [v]
        for i in v:
            if isinstance(i, dict):
                result = deep(i)
                if result is not None:
                    return result

我稍微整理了一下逻辑,让处理列表和字典的值变得更简单,并且改用了 isinstance(),这样也可以支持子类。

这个版本会 返回 它找到的第一个键;任何递归调用都会检查是否返回了 None,以判断这个递归调用是否找到了结果,并在这里结束搜索。

撰写回答