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



我正在使用EDX开始学习python,我被困在一个需要我创建一个井字游戏的项目上。

我相信我已经设法完成了大部分功能,但是当我尝试运行检查仓位是否可以标记为 X 或 O 的功能时,我总是得到错误的读数。它只对 7 返回 true,而不对其余项返回 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,具体取决于玩家。我尝试在没有函数的情况下运行该函数,并使用打印而不是返回并正常工作。

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")

知道我做错了什么吗?

让我们看看你的 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

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

为了克服您发现的问题,例如,您可以使用列表推导来展平列表并检查其中是否存在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))

你可以使用any来制作更 Python 的版本。

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

相关内容

最新更新