You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 07:58:02