使用 if 语句避免 IndexError
Avoid IndexError with if statemanet
我有一个包含每个坐标信息的“矩阵”(列表列表)。如果可能的话,我希望能够获得每个元素的邻居。如果没有,returnNone
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 的情况下实现此目的?向上和向左都可以。索引大于长度是问题
如果您将 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)
您应该检查 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
.
的拼写
我有一个包含每个坐标信息的“矩阵”(列表列表)。如果可能的话,我希望能够获得每个元素的邻居。如果没有,returnNone
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 的情况下实现此目的?向上和向左都可以。索引大于长度是问题
如果您将 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)
您应该检查 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
.