Python 3.6 - 如果项目与用户输入匹配,如何搜索2D列表并返回true或false

时间:2018-06-01 10:29:42

标签: python-3.x

我正在使用EDX开始学习python,我陷入了一个需要我创建一个tic tac toe游戏的项目。

我相信我已经设法完成了大部分功能但是当我尝试运行检查某个位置是否可以标记为X或O的函数时,我总是得到一个错误的读数。它仅对7而不是其余项目返回true。

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

location = input(" Turn, select a number (1, 9): ")

def available(location, board):
    for row in board:
        for col in row:
            if col==location:
                return True
            else:
                return False

print(available(location,board))

我决定将该功能与其余代码分开。上面的代码应该能够搜索2D列表,如果它找到用户输入的数字,则返回true或false。当它执行时,执行另一个功能以根据玩家将该数字更改为X或O.我尝试在没有函数的情况下运行该函数,而使用print而不是return并且工作正常。

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

location = input(" Turn, select a number (1, 9): ")
for row in board:
    for col in row:
        if col==location:
            print("True")
        else:
            print("False")

知道我做错了吗?

3 个答案:

答案 0 :(得分:1)

让我们来看看你的if else语句。

当输入数字不是7时,我们不返回true,而是转到else并立即返回false而不检查其余数字。

解决方案是删除else,只在遍历每个单元格后返回false。

当您更改返回打印时,此错误消失,因为您不再返回,因此执行不会提前停止。

def available(location, board):
    for row in board:
        for col in row:
            if col==location:
                return True

    return False

这里的关键见解是从函数返回,退出函数。

答案 1 :(得分:1)

要解决您发现的问题,您可以使用list comprehension展开列表,并检查其中是否存在location

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

location = input(" Turn, select a number (1, 9): ")

def available(location, board):
    #collect all elements from all sublists in a list 
    allfields = [i for j in board for i in j]
    #location element of this list?
    if location in allfields:
        return True

    return False

print(available(location,board))

答案 2 :(得分:0)

您可以使用any获取更多Pythonic版本。

def available(location, board):
    return any(any(i == location for i in row) for row in board)