列表索引超出范围(使用json)

2024-05-17 09:03:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我导入了json并按名称过滤了它。在

def lootprice(json_object, name):
    needobj = [obj for obj in json_object if obj['name'] == name][0]
    if needobj['have'] < needobj['max']:
        return needobj['price']

它工作了一段时间,然后显示了这种错误:

needobj = [obj for obj in json_object if obj['name'] == name][0] 

IndexError: list index out of range


Tags: namein名称jsonobjforreturnif
3条回答

您正在创建一个list对象,获取第一个元素,然后将该列表扔进垃圾箱。如果这是在一个活跃的网站,可能会变得昂贵。把你的列表理解放在生成器理解中(理解放在parens中,而不是方括号内)并在生成器上循环,这样当找到第一个时就可以提前返回。在

^{1}$

现在,当“name”和“have max”条件都满足时,就会返回。您可以将have max条件移到if条件中,但这可能会降低可读性。如果对json_对象进行“name”过滤后没有任何结果,那么循环将下降到出口处,您可以返回一个默认对象,或者按照这里的编码,返回一个可以由调用者检查的None。一个可以被调用者使用但表示找不到任何东西的默认对象将是更“pythonic”的。在

我评论的目的是试图找出这样一个事实:当列表为空时,你应该得出一个结论:你需要一个if检查。您在第2行得到IndexError: list index out of range,因为您试图在出现错误的情况下索引到一个空列表中。{json>如果我们需要用一个默认的值来覆盖这个变量。如果我们不这样做,我们将简单地返回默认值,如果我们这样做,我们将执行您在原始代码中的正确处理。在

^{1}$

如果obj['name']==name]返回空值,则json\u object中的[obj for obj in json\u object中没有搜索到的名称。您应该捕捉到该异常并相应地返回一些内容。在

^{1}$

完整示例如下:

^{pr2}$

相关问题 更多 >