2010-12-06 14 views
0

は、私がその周りに他の人とアイテム(その9つの項目の合計)の合計l=[[10,50,90],[70,80,90],[88,90,55]]Pythonの:リスト:範囲の例うち

10 50 90 
70 80 40 
88 90 55 

のようなリストを持っていることを想像してみてください。

ただし、国境のアイテムを合計すると、インデックスが範囲外になります。

インデックスが範囲外である場合、不足アイテム(範囲外インデックス)ごとに特定の番号(1など)を追加することができます。

私はエラーの処理方法を知りません。

ありがとうございます。

答えて

1

インデックスが境界外になると0を返す関数を定義し、それ以外の場合はグリッドの値を返します。次に、関数を各位置で呼び出した結果を合計します。

+0

私はあなたの方法を使いました。それはあなたと他のすべての人たちとうまくいっています。 – Alpagut

1

あなたは(http://wiki.python.org/moin/HandlingExceptionsは、いくつかの情報を持っている)の取り扱いのtry-catchスタイルエラーを使用するか、

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 

我々は第2の部分は端部を越えて延びることができる0に下限しなければならないので、スライスの最初の部分は負にすることはできません。

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

リストにフラットにする必要があります。私は、スライスのスライス上のdouble forループを使用してジェネレータを作成することを選択しました。

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]) 

if work elseを表示するには、if else else引数を判断しないでください。 ;)

>>>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 
関連する問題