检查索引是否在2d列表内[Python]

问题描述 投票:1回答:3

我必须编写一个函数(def),该函数检查我编写的索引是否在2d列表内。如果是,则必须返回True,否则必须返回False。

def height(board):
    height=0
    for x in board:
        height+=1
    return height

def width(board):
    wid=len(board[0])
    return wid

def on_board(board, x, y):
    check=False
    x1 = int(x)
    y1 = int(y)
    for x,y in board:
        if x1 > height(board) or y1 > width(board):
            check=False
    else:
        check=True
    return check

列表看起来像这样:

board = [["V1", "V1"],
         ["V2", "V2"],
         ["V3", "V3"]]
python list indexing 2d
3个回答
2
投票

最简单的方法是使用try..except..else,它将尝试访问板上的该点。如果有效,则它是有效位置,并且将输入else块。如果不是,则不是,将输入except块。另外,您还可以检查xy是否为有效整数。这里的任何失败都会产生False

def on_board(board, x, y):
    try:
        board[int(x)][int(y)]
    except (ValueError, IndexError):
        return False
    else:
        return True

[另外,板的高度仅为def height(board): return len(board)。但是,如果仅出于height()的目的仅具有width()on_board(),则根本不需要height()width()

作为determined in chat,正在检查程序的测试套件正在像我们一样使用0索引的行和列,但是第一个值是列(例如图形上的x坐标),第二个值是行。它还不接受-1的索引,以供用户指示最后一行/列。最后,它已经使用整数测试了函数,因此无需使用int()进行强制转换。

def on_board(board, x, y):
    return x in range(len(board[0])) and y in range(len(board))

此检查x是否在0(包括)与行中的列数(不包括)之间,以及y是否在0(包括)与之间的行数之间。董事会(不包括在内)。然后,它返回这两个条件是否都为真的布尔值。


0
投票

您可以使用两种编写的方法,然后您的on_board方法可以简单地检查它们

def height(board):
    return len(board)

def width(board):
    return len(board[0])

def on_board(board, x, y):
    return x < width(board) and y < height(board)

例如

>>> board = [["V1", "V1"],
             ["V2", "V2"],
             ["V3", "V3"]]
>>> on_board(board, 1, 0)
True
>>> on_board(board, 3, 4)
False

0
投票

对于遇到此问题需要解决方案的其他人,这是另一个。

对于使用上述try ... except技术的任何人,请注意,值-1不会导致IndexError(因为-1指向列表中的最后一个条目)。这可能会导致异常结果。

def check_if_cell_exists(board, find_x, find_y):
    for x_index, column in enumerate(board):
        for y_index, cell in enumerate(column):
            if x_index == find_x and y_index == find_y:
                return True
    return False
© www.soinside.com 2019 - 2024. All rights reserved.