【问题标题】:Handling out of range list index in Python 2.7在 Python 2.7 中处理超出范围的列表索引
【发布时间】:2016-02-24 11:14:06
【问题描述】:

我有一个 Python 2.7 中的列表列表,如下所示

rr =[[10 for row in range(5)] for col in range(5)]

现在,在我的算法中,我需要找到给定列表元素的邻居,我使用以下方法检查邻居

b = [rr[rn][cn+1],rr[rn-1][cn+1],rr[rn-1][cn],rr[rn-1][cn-1],rr[rn][cn-1],rr[rn+1][cn-1],rr[rn+1][cn],rr[rn+1][cn+1]]

我想将0 分配给给定矩阵(或列表)边界之外的相邻元素

其中rn 是行索引,cn 是我要检查的列表单元格的列索引。如上所述,如果我的代码检查任何角落单元格怎么办?比如索引为[0,0] 的第一行和第一列单元格元素,一些邻居索引将为负数。我的代码有一个特殊的属性,它阻止我向上面指示的列表中添加额外的行或列。

如何处理?任何帮助....

【问题讨论】:

  • 同意,它必须是 rr[a][b] 而不是 rr[a,b]

标签: python list python-2.7 error-handling


【解决方案1】:

要解决绑定问题和rr[i,j] 语法,您可以在类中重载getitem 方法:

class boundedlist(list):
    def __getitem__(self,indices):
        try: 
            l=list(self)
            for i in indices : l=l[i]
            return l
        except IndexError:
            return 0 

然后一切如你所愿:

In [76]: brr=boundedlist(rr)

In [77]: brr[4,3]
Out[77]: 10

In [78]: brr[4,6]
Out[78]: 0

In [79]: brr[-1,6]
Out[79]: 0

In [80]: brr[10,4]
Out[80]: 0

你保持这样的行访问权限:

In [81]: brr[[4]]
Out[81]: [10, 10, 10, 10, 10]

并且您可以推广到更多维度。如果要修改数据,则必须调整 __setitem__

【讨论】:

    【解决方案2】:

    如果你想访问rr列表中的cell(1,1),你必须使用rr[1][1]

    for i in range(len(rr)):
        for j in range(len(rr[i])):
            if (i, j) in [(rn, cn+1), (rn-1,cn+1 ), (rn-1, cn ), (rn-1, cn-1 ), (rn, cn-1 ), (rn+1, cn-1 ), (rn+1, cn ), (rn+1, cn+1)]:
                #Do some things
            else:
                #Do other things
    

    【讨论】:

    • 这可以很好地跳过超出范围的列表,但只是好奇......有什么方法可以为那些超出范围的索引元素分配值?
    猜你喜欢
    • 2019-05-18
    • 1970-01-01
    • 2014-01-16
    • 1970-01-01
    • 2020-03-16
    • 1970-01-01
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    相关资源
    最近更新 更多