スライシングがこの問題の鍵です。それは優雅に縁を扱うことができます。トリッキーな部分は、正しいスライス範囲を選択することです。
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
私はあなたの方法を使いました。それはあなたと他のすべての人たちとうまくいっています。 – Alpagut