打破字典循环

时间:2014-08-13 20:46:36

标签: python python-2.7 dictionary break

我有一个循环通过JSON对象的函数。该对象通常以几种不同的格式返回,我需要找到一个特定的键并打印它的值。此外,有时我需要的密钥多次列出。所以,我只想打印第一个。我尝试过休息,但似乎没有用。有什么想法吗?

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 个答案:

答案 0 :(得分: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的任何递归调用,以查看该递归调用是否出现了什么,并在那里中断了搜索。