我有一个循环通过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)
答案 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
的任何递归调用,以查看该递归调用是否出现了什么,并在那里中断了搜索。