【问题标题】:make a value zero if exception list index out of range如果异常列表索引超出范围,则将值设为零
【发布时间】:2015-08-17 23:43:24
【问题描述】:

我正在 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,只希望给出错误的元素

【问题讨论】:

    标签: python list exception-handling


    【解决方案1】:

    这是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),实际上它超出了界限,但它会给出第二个数组的最后一个元素。

    【讨论】:

      【解决方案2】:

      当我读到这篇文章时,我立即想到了将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
      

      【讨论】:

        【解决方案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

        【讨论】:

        • 值得一提的是,要创建此对象,您必须执行以下操作:zlist(S).
        【解决方案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))
        

        【讨论】:

        • 我不希望总和为0,只是导致错误的元素
        • @Rasmnev 然后,通过显示输入和所需输出的示例,您需要在提出问题时更加清楚。如果 3 个不同的人误解了你问题的意图,那么你就没有问清楚。我已经编辑了我的帖子。
        • 对不起。下次我会尝试更清楚,我会更新问题
        猜你喜欢
        • 2014-11-30
        • 1970-01-01
        • 2011-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多