我有一个列表列表
a = [[0,1,2,3,],[4,5,6,7,[8,9,10,11],[12,13,14,15]]
对于某些a[i][j]
,有没有办法获得周围的8个值而不必指定a[i-1][j-1],a[i][j-1],...,a[i+1][j+1]
?如果不是,至少有一种方法可以处理边缘案件,而不必检查我是否处于边缘状态?
我有一个列表列表
a = [[0,1,2,3,],[4,5,6,7,[8,9,10,11],[12,13,14,15]]
对于某些a[i][j]
,有没有办法获得周围的8个值而不必指定a[i-1][j-1],a[i][j-1],...,a[i+1][j+1]
?如果不是,至少有一种方法可以处理边缘案件,而不必检查我是否处于边缘状态?
我找不到很干净的方法来做到这一点,但是使用切片似乎比访问单个元素更Python化。另外,您只需要使用此方法检查顶部和底部边缘。
def foo(a):
for r_i in range(len(a)):
for i in range(len(a[0])):
values = []
if r_i > 0:
values.extend(a[r_i - 1][max(0,i - 1):i + 2])
values.extend(a[r_i][max(0,i - 1):i + 2])
if r_i < len(a) - 1:
values.extend(a[r_i + 1][max(0,i - 1):i + 2])
print(values) # do stuff with `values`
,
假设n
是行数,m
是列数。
首先,i和j何时有效?如果0 <= i < n
和0 <= j < m
有效。
#Code to check if i and j are valid
def is_valid(i,j,n,m):
if 0 <= i < n and 0 <= j < m:
return True
return False
要获取相邻的值,您必须找到所有可能的组合,这些组合什么都不做,对i
和j
都加1或减去1。但是,如果您对i
和j
均不执行任何操作,它将为您提供当前不需要的元素。
#Code to get the adjacent values
def get_adjacent(a,i,m):
l = []
for x in [-1,1]:
for y in [-1,1]:
if not (x == y == 0) and is_valid(i+x,j+y,m):
l.append(a[i+x][j+y])
return l
希望这对您有帮助!
,我找到了以下解决边缘问题的解决方案。不知道是否有更Python化的方式。
a = [[0,1,2,3,],[4,5,6,7,[8,9,10,11],[12,13,14,15]]
def print_edge_values(outer_idx,outer_len,inner_idx,inner_len):
print("sorrounding values: "),for i in range(max(0,outer_idx-1),min(outer_idx+2,outer_len)):
for j in range(max(0,inner_idx-1),min(inner_idx+2,inner_len)):
if((i,j) != (outer_idx,inner_idx)):
print((i,j),"=",a[i][j]," "),print("")
for idx,item in enumerate(a):
print(idx,":",item)
for idx2,i in enumerate(item):
print("value(%d,%d)= %d" % (idx,idx2,a[idx][idx2]))
print_edge_values(idx,len(a),len(item))