Python如何在嵌套字典/JSON中全局查找指定key?
解决PokeAPI进化链species数据提取问题
问题根源
原代码只遍历了进化链的第一层evolves_to,但PokeAPI的进化链是嵌套结构(比如三阶进化的宝可梦,evolves_to内部还会嵌套下一层evolves_to),因此遗漏了深层进化数据。你写的递归生成器存在两处关键错误:
- 递归调用时错误地使用了数据对象
allevochainsjson,而非调用自身函数 - 参数传递逻辑混乱,没有把要查找的key和当前遍历的数据正确传入
另外,生成器是惰性迭代器,直接打印会显示内存地址,必须通过遍历(转列表、for循环)才能获取实际数据。
修正后的实现方案
1. 重构递归生成器,实现全量递归查找
把递归查找逻辑抽成独立辅助方法,和API请求代码解耦:
class PokeSearch: def __init__(self, species_url, base_url): self.species_url = species_url self.base_url = base_url self.newspeciesid = 1 # 替换为你的实际ID def _find_all_species(self, data, target_key='species'): """递归遍历JSON结构,返回所有target_key对应的值""" if isinstance(data, dict): for k, v in data.items(): if k == target_key: yield v else: yield from self._find_all_species(v, target_key) elif isinstance(data, list): for item in data: yield from self._find_all_species(item, target_key) def get_full_evolution_species(self): # 获取进化链API数据 species_res = requests.get(f"{self.species_url}{self.newspeciesid}") species_data = species_res.json() evo_chain_res = requests.get(species_data['evolution_chain']['url']) evo_chain_data = evo_chain_res.json() # 从生成器提取所有species数据,转成列表 all_species = list(self._find_all_species(evo_chain_data)) # 若只需要name字段,可进一步处理 species_names = [spec['name'] for spec in all_species] return species_names
2. 正确使用生成器
生成器不会直接返回结果列表,需通过以下方式获取数据:
- 转成列表:
list(generator_object) - 循环迭代:
# 示例调用 poke_search = PokeSearch(your_species_url, your_base_url) for species in poke_search._find_all_species(evo_chain_data): print(species['name'])
原代码缺陷说明
原代码仅处理chainsreqjson['chain']['evolves_to']的第一层元素,没有处理每个元素内部可能存在的evolves_to嵌套结构,因此会漏掉二阶、三阶进化的宝可梦数据。
内容的提问来源于stack exchange,提问作者ehrgein
相关产品推荐
相关产品推荐

