在字典循环中中断
我有一个函数,它会遍历一个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
,以判断这个递归调用是否找到了结果,并在这里结束搜索。