如果异常列表索引超出范围,则使值为零

时间:2015-06-03 16:21:47

标签: python list exception-handling

我在python中进行一些计算,如果它们在列表中,我必须从列表中对项目求和。这是代码:

Ei=-J*S[i][j]*(S[i+1][j]+S[i-1][j]+S[i][j+1]+S[i][j-1])

我想要的是使得给出错误list index out of range的元素的值为零。有没有办法在不验证总和的每个元素是否存在的情况下执行此操作?

提前致谢

  

修改

我不希望总和为0,只有产生错误的元素

4 个答案:

答案 0 :(得分:4)

您可以使用try / except

编写一个函数
def get_value(S, i, j):
    try:
        return S[i][j]
    except IndexError:
        return 0

然后使用它

 Ei = -J * get_value(S, i, j) * (get_value(S, i+1, j) + get_value(S, i-1, j) +get_value(S, i, j+1) + get_value(S, i, j-1))

答案 1 :(得分:3)

子类list并覆盖__getitem__

class zlist(list):
    def __getitem__(self,n):
        if len(self) <= n:
            return 0
        return super(zlist, self).__getitem__(n)

如果需要处理多维列表,您可以执行以下操作:

class zlist(list):
    def __init__(self, dim=1, *args):
        list.__init__(self, *args)
        self.dim = dim

    def __getitem__(self,n):
        if len(self) <= n:
            if self.dim > 1:
                return zlist(self.dim-1)
            else:
                return 0

        return super(zlist, self).__getitem__(n)

另外,请查看Is there a simple way to override the list object's method __getitem__?,它类似,但扩展了缺少值的列表。

最后,为了完整性,如果你只想要一个零填充的多维数组,请使用numpy:http://docs.scipy.org/doc/numpy/reference/generated/numpy.zeros.html

答案 2 :(得分:0)

当我读到这篇文章时,我立即对子list进行了子类化并添加了一个 功能类似于get()的{​​{1}}方法。

dict.get()

答案 3 :(得分:0)

这是一种比accepted one 更简单,更好的方法。

def get_value(a, i, j):
    if i <0 or j <0:
        return 0
    try:
        return a[i][j]
    except IndexError:
        return 0

因为当i和j仍为负值时,这在python中仍然有效。例如,您在(3,0)处并且需要(3-1,0-1)值是(2,-1),实际上它是超出范围的,但它将给出第二个数组的最后一个元素。