2010-12-06 78 views
0

想象,我有一个像l=[[10,50,90],[70,80,90],[88,90,55]]的Python:列表:超出范围的情况下

10 50 90 
70 80 40 
88 90 55 

列表我总结一个项目与周围的其他人(这样的9项之和)。

但是,如果我选择在边界上合计项目,那么索引将超出范围。

是否有可能在索引超出范围而不是窃听时为每个缺失项目(超出范围索引)添加特定数字(如1)。

我只是不知道如何处理错误。

在此先感谢。

回答

1

定义一个函数,当索引超出边界时返回0,否则返回网格中的值。然后总结调用每个职位的功能的结果。

+0

我已经使用了你的方法,它工作得很好,thx你和其他人。 – Alpagut 2010-12-06 15:01:20

1

您可以使用的try-catch样式的错误处理(http://wiki.python.org/moin/HandlingExceptions有一些信息)或if块像

if (index == 0) then 
    handleEdgeCase(index) 
else 
    handleGeneralCase(index) 

注意到了编写代码不寻常的情况并处理它们。

1

切片是这个的关键。它可以优雅地处理边缘。棘手的部分是选择正确的切片范围。

l=[[10,50,90],[70,80,90],[88,90,55]] 

逻辑是:

rows = l[row_idx-1:row_idx+2] 
cols = row[col_idx-1:col_idx+2] for row in rows 

切片的第一部分不能为负所以我们必须为0的第二部分到下界可以延伸超出端部。

xleft = x-1 if x>0 else x 
l[xleft:x+2] 

它需要被压扁成一个列表,我选择创建一个生成器使用循环切片的双重循环。

def neighbours(iterable, x, y): 
    xleft = x-1 if x>0 else x 
    yleft = y-1 if y>0 else y 
    return (i for row in l[xleft:x+2] for i in row[yleft:y+2]) 

只是为了显示一些工作,请不要判断其他切片参数。 ;)

>>>x,y = 0,0 
>>>print list(i for row in l[x-1 if x>0 else x:x+2] for i in row[y-1 if y>0 else y:y+2]) 
[10, 50, 70, 80] 
>>>print sum(i for row in l[x-1 if x>0 else x:x+2] for i in row[y-1 if y>0 else y:y+2]) 
210 

>>>x,y = 1,1 
>>>print list(neighbours(l, x, y)) 
[10, 50, 90, 70, 80, 90, 88, 90, 55] 
>>>print sum(neighbours(l, x, y)) 
623  

>>>x,y = 2,2 
>>>print list(neighbours(l, x, y)) 
[80, 90, 90, 55] 
>>>print sum(neighbours(l, x, y)) 
315