我有一个代表 tic tac toe board 的列表。
board = [1,2,3,4,5,6,7,8,9]
我有一个嵌套列表中的胜利组合列表。
wins = [[7,8,9],[4,5,6],[1,2,3],[7,4,1],[8,5,2],[9,6,3],[1,5,9],[3,5,7]]
我有一个迭代wins
列表的函数。如果wins
列表中存在board
列表的组合,则该函数应返回true。
示例:
board = [4,5,6,9]
def win(board):
wins = [[7,8,9],[4,5,6],[1,2,3],[7,4,1],[8,5,2],[9,6,3],[1,5,9],[3,5,7]]
for w in wins:
if w in board:
return True
return False
这应该(我认为)返回True,因为胜利列表中的3位数字在主板列表中,但由于某种原因它会一直返回false。
我的代码上遗漏了什么吗?
由于
答案 0 :(得分:4)
您的代码存在两个问题:
w in board
不检查w
中的各个元素是否在board
中,但w
整体上是board
的元素,任何w
False
无效(假设第一次检查有效),则会返回w
,而不是在您测试 all 之后w
1}} 相反,您可以使用嵌套的any
和all
来检查是否任何获胜组合,所有元素都在board
。
>>> wins = [[7,8,9],[4,5,6],[1,2,3],[7,4,1],[8,5,2],[9,6,3],[1,5,9],[3,5,7]]
>>> board = [4,5,6,9]
>>> any(all(x in board for x in w) for w in wins)
True
或者,由于顺序无关紧要且每个元素只出现一次,因此您可以改为使用sets
(注意{...}
中的内部wins
)并使用{{3 }}:
>>> wins = [{7,8,9},{4,5,6},{1,2,3},{7,4,1},{8,5,2},{9,6,3},{1,5,9},{3,5,7}]
>>> any(w.issubset(board) for w in wins)
True
答案 1 :(得分:1)
首先,它只检查第一个'win'组合([7,8,9]
),然后只返回false。其次,您无法使用in
运算符进行检查。
>>> [1,2,3] in [4,1,2,3,6]
False
因此,如果您想检查组合是否在板上(按相同顺序):
for w in wins:
if ''.join(w) in ''.join(board):
return True
else: # note indentation. else is part of for expression.
return False
如果订单无关紧要:
for w in wins:
if all(x in board for x in w):
return True
else:
return False
答案 2 :(得分:0)
你需要让你的回报变为假,因为你在第一次迭代后结束循环
答案 3 :(得分:0)
您需要检查棋盘中的元素是否与胜利元素匹配。您当前的代码将始终返回False,因为它检查[4,5,6,9]是否在win元素中。检查董事会中的元素是否与获胜组合相匹配的一种方法是将所有元素与赢得的所有元素相交:
def win(board):
wins = [[7,8,9],[4,5,6],[1,2,3],[7,4,1],[8,5,2],[9,6,3],[1,5,9],[3,5,7]]
for w in wins:
if list(set(w) & set(b)) == w:
return "won"
return "no win"