python - 使用 if 语句避免索引错误

我有一个包含每个坐标信息的“矩阵”(列表列表)。如果可能的话,我希望能够获得每个元素的邻居。如果不是,则返回无

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-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 的拼写。

回答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)

相似文章