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

时间:2016-12-23 23:01:54

标签: 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列表中存在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。

我的代码上遗漏了什么吗?

由于

4 个答案:

答案 0 :(得分:4)

您的代码存在两个问题:

  • w in board不检查w中的各个元素是否在board中,但w整体上是board的元素,任何w
  • 都不是这种情况
  • 如果第一个False无效(假设第一次检查有效),则会返回w,而不是在您测试 all 之后w 1}}

相反,您可以使用嵌套的anyall来检查是否任何获胜组合,所有元素都在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"