Python 检查与其他列表匹配的嵌套列表值组合
我有一个列表,表示一个tic-tac-toe-boardPython 检查与其他列表匹配的嵌套列表值组合,python,python-2.7,list,Python,Python 2.7,List,我有一个列表,表示一个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列表中的组合,则函数应返回true 例如: board = [4,5,6,9] def win(board): wins = [[7,
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
列表中的组合,则函数应返回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
这应该(我认为)返回真,因为赢名单中的3位数字在董事会名单上,但由于某种原因,它一直返回假
我的代码有什么遗漏吗
谢谢您需要删除返回false,因为您在第一次迭代后结束循环首先,它只检查第一个“赢”组合(
[7,8,9]
),然后只返回false。其次,不能像这样使用操作符中的来检查它
>>> [1,2,3] in [4,1,2,3,6]
False
因此,如果您想检查组合是否在电路板上(顺序相同):
如果订单不重要:
for w in wins:
if all(x in board for x in w):
return True
else:
return False
您的代码有两个问题:
w在board
中不检查w
的单个元素是否在board
中,而是检查w
作为一个整体是否是board
的一个元素,这对于任何w
- 当第一个
w
不起作用时(假设第一个检查起作用),而不是在测试了所有w
相反,您可以使用嵌套的and来检查任何获胜组合的所有元素是否都在板中
>>> 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
或者,由于顺序无关紧要,每个元素只应出现一次,因此您可以使用集合
(注意wins
中的内部{…}
),并使用:
您需要检查棋盘中的元素是否与win元素匹配。您当前的代码将始终返回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"
board
到底代表什么?其中一名玩家设置标记的位置?例如,当您在棋盘中检查if w时,您在[4,5,6,9]中检查if[4,5,6]
。现在-[4,5,6,9]中的4
返回true,但是您的板没有任何项目本身就是一个列表。b中的a
测试列表b
是否包含a
但您的列表不包含a
。您正在寻找与b
@tobias_k的子集相等的值,这是正确的。非常干净和简单!谢谢
>>> 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
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"