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

make a value zero if exception list index out of range

我正在 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 的元素的值设为零。有没有办法在不验证总和的每个元素是否存在的情况下执行此操作?

提前致谢

Edit

我不希望总和为0,只希望给出错误的元素

您可以使用 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))

子类 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

当我读到这篇文章时,我立即想到继承 list 并添加一个 get() 功能类似于 dict.get() 的方法。

class MyList(list):
    def get(self, idx, default=None):
        try:
            return self.__getitem__(idx)

        except IndexError:
            return default

my_list = MyList(range(6))
assert my_list == [0, 1, 2, 3, 4, 5]
assert my_list.get(0, 0) == 0
assert my_list.get(5, 0) == 5
assert my_list.get(10, 0) == 0

这是 .

简单且更好的方法
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),实际上它超出范围但它会给出第二个数组的最后一个元素。