Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 检查与其他列表匹配的嵌套列表值组合_Python_Python 2.7_List - Fatal编程技术网

Python 检查与其他列表匹配的嵌套列表值组合

Python 检查与其他列表匹配的嵌套列表值组合,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,

我有一个列表,表示一个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,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"