[英]Pythonic way of comparing all adjacent values in a list of lists?
我有一個列表列表
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]
? 如果沒有,至少有一種方法可以處理邊緣案件,而不必檢查我是否處於邊緣?
假設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, j, n, m):
l = []
for x in [-1, 0, 1]:
for y in [-1, 0, 1]:
if not (x == y == 0) and is_valid(i+x, j+y, n, m):
l.append(a[i+x][j+y])
return l
希望這有幫助!
我找不到一個非常干凈的方法來做到這一點,但使用切片似乎比訪問單個元素更 Pythonic。 此外,您只需使用此方法檢查頂部和底部邊緣。
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`
我找到了以下解決邊緣情況的解決方案。 不確定是否有更pythonic的方式。
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), idx2, len(item))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.