2010-12-06 48 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