从含整数键的字典取值遇IndexError,如何解决?
问题分析与解决方法
错误原因
你犯了三个核心错误:
- 混淆了列表与函数的调用方式:
listOfInformation是列表类型,不能用圆括号()调用,列表元素的正确访问方式是方括号[]。 - 错误使用列表索引:你的列表仅包含1个元素(索引为0),直接用
pokemon_id(如123456789)作为列表索引,必然超出列表长度,触发IndexError: list index out of range。 - 数据结构访问逻辑错误:列表内部嵌套的是字典,你需要先获取列表中的字典元素,再通过
pokemon_id作为字典键查找对应值,而非直接用pokemon_id操作列表。
解决方法
方法1:适配现有数据结构修正逻辑
先提取列表中的字典元素,再通过字典键查询目标值:
# 原始数据结构 listOfInformation = [{123456789: {'PokemonId': '123456789', 'PokemonName': 'Pikachu', 'PokemonAttack': 'thunderbolt'}}] def get_pokemon_info(pokemon_id): # 获取列表中唯一的字典元素 pokemon_map = listOfInformation[0] # 用get方法安全取值,避免键不存在时触发KeyError return pokemon_map.get(pokemon_id) # 调用示例 result = get_pokemon_info(123456789) print(result) # 输出:{'PokemonId': '123456789', 'PokemonName': 'Pikachu', 'PokemonAttack': 'thunderbolt'}
方法2:优化数据结构(更推荐)
既然你是通过pokemon_id做查询,直接使用字典结构会更高效,无需嵌套列表:
# 优化后的字典结构 pokemon_info = { 123456789: {'PokemonId': '123456789', 'PokemonName': 'Pikachu', 'PokemonAttack': 'thunderbolt'}, # 可扩展添加更多宝可梦数据 987654321: {'PokemonId': '987654321', 'PokemonName': 'Charmander', 'PokemonAttack': 'Flamethrower'} } def get_pokemon_info(pokemon_id): # 自定义默认返回值,避免无匹配时返回None return pokemon_info.get(pokemon_id, "未找到对应宝可梦信息") # 调用示例 print(get_pokemon_info(123456789))
关键注意点
- 列表是有序集合,通过从0开始的整数索引访问元素;字典是键值对集合,通过键访问对应值,两者访问逻辑完全不同。
- 使用字典的
get()方法可以避免键不存在时抛出KeyError,还能自定义默认返回内容。
内容的提问来源于stack exchange,提问作者qabootar
相关产品推荐
相关产品推荐

