想象,我有一个像l=[[10,50,90],[70,80,90],[88,90,55]]
的Python:列表:超出范围的情况下
10 50 90
70 80 40
88 90 55
列表我总结一个项目与周围的其他人(这样的9项之和)。
但是,如果我选择在边界上合计项目,那么索引将超出范围。
是否有可能在索引超出范围而不是窃听时为每个缺失项目(超出范围索引)添加特定数字(如1)。
我只是不知道如何处理错误。
在此先感谢。
想象,我有一个像l=[[10,50,90],[70,80,90],[88,90,55]]
的Python:列表:超出范围的情况下
10 50 90
70 80 40
88 90 55
列表我总结一个项目与周围的其他人(这样的9项之和)。
但是,如果我选择在边界上合计项目,那么索引将超出范围。
是否有可能在索引超出范围而不是窃听时为每个缺失项目(超出范围索引)添加特定数字(如1)。
我只是不知道如何处理错误。
在此先感谢。
定义一个函数,当索引超出边界时返回0,否则返回网格中的值。然后总结调用每个职位的功能的结果。
您可以使用的try-catch样式的错误处理(http://wiki.python.org/moin/HandlingExceptions有一些信息)或if块像
if (index == 0) then
handleEdgeCase(index)
else
handleGeneralCase(index)
注意到了编写代码不寻常的情况并处理它们。
切片是这个的关键。它可以优雅地处理边缘。棘手的部分是选择正确的切片范围。
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
我已经使用了你的方法,它工作得很好,thx你和其他人。 – Alpagut 2010-12-06 15:01:20