如果异常列表索引超出范围,则将值设为零
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),实际上它超出范围但它会给出第二个数组的最后一个元素。
我正在 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),实际上它超出范围但它会给出第二个数组的最后一个元素。