首页 文章

检查在另一个列表上匹配的嵌套列表值组合

提问于
浏览
2

我有一个代表 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 列表的函数 . 如果 board 列表中存在 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

这应该(我认为)返回True,因为胜利列表中的3位数字在董事会列表中,但由于某种原因它会继续返回false .

我错过了我的代码吗?

谢谢

4 回答

  • 4

    首先,它只检查第一个'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
    
  • 1

    您的代码有两个问题:

    • w in board 不检查 w 的各个元素是否在 board 中,但是 w ,作为一个整体,是否是 board 的元素,而不是 w 的情况 .

    • 只要第一个 w 无效(假设第一次检查有效),你就会返回 False ,而不是在你测试完所有 w 之后

    相反,您可以使用嵌套的anyall来检查是否所有元素都在_2390817中 .

    >>> 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 中的内部 {...} )并使用issubsetof

    >>> 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
    
  • 0

    你需要让你的返回假,因为你在第一次迭代后结束循环

  • 0

    您需要检查棋盘中的元素是否与胜利元素匹配 . 您当前的代码将始终返回False,因为它检查[4,5,6,9]是否在win元素中 . 检查董事会中的元素是否与获胜组合相匹配的一种方法是将所有元素与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"
    

相关问题