使用 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-1cidx-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.

的拼写