我在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,只有产生错误的元素
答案 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),实际上它是超出范围的,但它将给出第二个数组的最后一个元素。>