想象,我有一個像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