如何在Python中检查2D数组中元素的类型

时间:2018-07-08 18:55:14

标签: python list

我一直在尝试制作井字游戏,到目前为止,我只创建了一个应该打印出棋盘的功能:

    board = [[1,2,3],[4,5,6],[7,8,9]]

    def drawboard(board):
        for row in board:
            for item in row:
                if type(board[row][item]) == "int":
                    print(str(board[row][item]))
                    print("|")
                else:
                    print(board[row][item])
                    print("|")
            print("\n")
            print("------")
            print("\n")

    drawboard(board)

如您所见,我函数的一部分是检查列表内列表内元素的类型,但这给我一个错误:

  

回溯(最近通话最近):文件“ / Users / Tony / Desktop / coding   Things / tic tac toe.py”,第22行,在       画板(画板)\文件“ / Users / Tony / Desktop / coding Things / tic tac toe.py”,第12行,在画板中       if type(board [row] [item])==“ list”:TypeError:列表索引必须是整数或切片,而不是列表

2 个答案:

答案 0 :(得分:1)

在您的for循环中,rowitem不是索引,您只需要检查item的类型即可,您需要更改以下行:

if type(board[row][item]) == "int":

if isinstance(item, int):

修复后:

def drawboard(board):
    for row in board:
        for item in row:
            if isinstance(item, int):
                print(str(item))
                print("|")
            else:
                print(item)
                print("|")
        print("\n")
        print("------")
        print("\n")

答案 1 :(得分:1)

这里有一些问题:

  1. 如果您遍历列表,则遍历列表的元素,而不是 indices ;和
  2. 如果您查询type(..),您会不是获得字符串作为返回元素,而是获得对该类的引用。因此,您可以像这样解决此问题:
    board = [[1,2,3],[4,5,6],[7,8,9]]

    def drawboard(board):
        for row in board:
            for item in row:
                if type(item) == int:
                    print(str(item))
                    print("|")
                else:
                    print(item)
                    print("|")
            print("\n")
            print("------")
            print("\n")

    drawboard(board)

由于非str版通常在您调用打印时是str(..)版,因此我们甚至可以将ifelse分支合并为:

def drawboard(board):
    for row in board:
        for item in row:
            print(item)
            print("|")
        print("\n")
        print("------")
        print("\n")

drawboard(board)

如果继续进行这种类型检查,通常检查类型相等性也不是一个好主意。由于如果元素是子类的,则类型不再为int。然后,您最好使用isinstance(..)