我有一个包含每个坐标信息的“矩阵”(列表列表)。如果可能的话,我希望能够获得每个元素的邻居。如果不是,则返回无
matrix = [ [{"name":"A"},{"name":"B"}],
[{"name":"C"},{"name":"D"}]]
for ridx, slotRow in enumerate(matrix):
for cidx, slotData in enumerate(slotRow):
n ={
"up": matrix [ridx-1][cidx] if ridx-1 > 0 else None,
"down": matrix[ridx+1][cidx] if ridx+1 < len(matrix) else None,
"left": matrix[ridx][cidx-1] if cidx-1 > 0 else None,
"right": matrix[ridx][cidx+1] if cidex+1 < len(matrix[ridx]) else None
}
print(n)
有没有办法在没有 IndexError 或没有每个邻居的 Try/Except 的情况下实现这一点?向上和向左都可以。大于长度的索引是问题
回答1
您应该检查 ridx-1
和 cidx-1
是否大于或等于 0,因为零是第一个有效索引。所以:
matrix = [[{"name":"A"},{"name":"B"}],
[{"name":"C"},{"name":"D"}]]
for ridx, slotRow in enumerate(matrix):
for cidx, slotData in enumerate(slotRow):
n = {
"up": matrix [ridx-1][cidx] if ridx-1 >= 0 else None,
"down": matrix[ridx+1][cidx] if ridx+1 < len(matrix) else None,
"left": matrix[ridx][cidx-1] if cidx-1 >= 0 else None,
"right": matrix[ridx][cidx+1] if cidx+1 < len(matrix[ridx]) else None
}
print(n)
顺便说一句,检查最后一个 cidx+1
的拼写。
回答2
如果您将 cidex+1
重命名为 cidx+1
,您的代码也可以工作,而且我认为您想要 >= 0
而不是 > 0
if ridx-1 > 0
--> if ridx-1 >= 0
否则您将丢失第一个索引
解决方案:
matrix = [[{"name":"A"},{"name":"B"}],
[{"name":"C"},{"name":"D"}]]
for ridx, slotRow in enumerate(matrix):
for cidx, slotData in enumerate(slotRow):
n = {
"up": matrix [ridx-1][cidx] if ridx-1 >= 0 else None,
"down": matrix[ridx+1][cidx] if ridx+1 < len(matrix) else None,
"left": matrix[ridx][cidx-1] if cidx-1 >= 0 else None,
"right": matrix[ridx][cidx+1] if cidx+1 < len(matrix[ridx]) else None
}
print(n)