如果列表索引之一超出范围,如何为两个列表编写条件

时间:2018-11-28 08:37:39

标签: python

我有两个列表,一个包含4个元素,另一个包含4(满足特定条件时为4)。 我正在编写一个用于相交矩形的函数。 每个列表必须包含4个元素。 (列表为humanRegion_bbs,dominants_bbs)。我试过下面的代码,但是domings_bbs没有必需的4个坐标,因此出现此错误。

def setBelongings(self,image,humanRegion_bbs, belongings_bbs):
        x_left = max(humanRegion_bbs[0],belongings_bbs[0])
        y_top  = max(humanRegion_bbs[1],belongings_bbs[1])
        x_right = min(humanRegion_bbs[2],belongings_bbs[2])
        y_bottom = min(humanRegion_bbs[3],belongings_bbs[3]) 

现在,当我调用此函数(此处仅提及函数的代码段)时,会产生以下错误,我已经知道为什么会发生。 当我添加if条件以检查列表是否为空时,它给出了ValueError。 如果您能告诉我如何解决此问题,我们将不胜感激。

2 个答案:

答案 0 :(得分:1)

如果列表中没有足够的元素,那么您将无法访问它们。

您可以做的是添加更多有意义的错误检查。例如。您可以使用assert检查列表的有效性:

assert len(humanRegion_bbs) == 4
assert len(belongings_bbs) == 4

if len(humanRegions_bbs) != 4 or len(belongings_bbs) != 4:
  raise ValueError('length mismatch: {}, {}'
                   .format(len(humanRegions_bbs), len(belongings_bbs)))

这些东西会为您提供可解释的错误消息。

我还建议通过打印数组或检查程序是否出现异常行为,通过其他方式检查它们,以检查实际传递给函数的内容。然后,您可以找到问题的根源。


除此之外,您还可以使用更紧凑的方式编写函数:

xl, xt, xr, xb = [max(*x) for x in zip(humanRegion_bbs, belongings_bbs)]

这有助于避免手动输入索引时容易漏入的错误。

答案 1 :(得分:1)

如果您不喜欢抛出异常(使用上面的assert方法),也可以在函数中进行三元检查:

x_left = max(
    humanRegion_bbs[0] if len(humanRegion_bbs) >= 1 else 0,
    belongings_bbs[0] if len(belongings_bbs) >= 1 else 0)

等等我猜每隔一个索引。