defflat(x): for key, value in x.items(): ifisinstance(value, dict): for k, v in flat(value): k = f'{key}_{k}' yield (k, v) else: yield (key, value)
你的第一反应,是不是这样修改代码:
1 2 3 4 5 6 7 8 9 10
defflat(x): for key, value in x.items(): ifisinstance(value, dict): for k, v in flat(value): k = f'{key}_{k}' yield (k, v) elifisinstance(value, list): "一大堆处理列表的代码" else: yield (key, value)
如果你使用return和递归,你可能确实需要这样写。
但如果你使用yield关键字,那么,你虽然也要修改代码,可是修改的地方却不是这里。我们要修改的地方在for key, value in x.items()。
defiter_x(x): ifisinstance(x, dict): for key, value in x.items(): yield (key, value) elifisinstance(x, list): for index, value inenumerate(x): yield (index, value)
现在,我们在原来的代码中调用这段个新的生成器函数:
1 2 3 4 5 6 7 8
defflat(x): for key, value in iter_x(x): ifisinstance(value, (dict, list)): for k, v in flat(value): k = f'{key}_{k}' yield (k, v) else: yield (key, value)
其中,isinstance(value, (dict, list)),相当于isinstance(value, dict) or isinstance(value, list)。