如何在生成器表达式Python中添加限制

如何在生成器表达式Python中添加限制,python,python-3.x,generator,Python,Python 3.x,Generator,我在Python中有一个函数,如果网格矩阵中的所有行或列都是相同的值,它将返回true。 但是,我希望我的函数停止迭代,并在其中4个匹配时立即返回True,而不管网格大小如何。如何修改下面的生成器表达式以实现相同的效果 def check_won(grids, user, n): return any(all(cell == user for cell in grid) for grid in grids) 为了进一步说明,我将分享我的示例输出: Input the grid size

我在Python中有一个函数,如果网格矩阵中的所有行或列都是相同的值,它将返回true。 但是,我希望我的函数停止迭代,并在其中4个匹配时立即返回True,而不管网格大小如何。如何修改下面的生成器表达式以实现相同的效果

def check_won(grids, user, n):
    return any(all(cell == user for cell in grid) for grid in grids)
为了进一步说明,我将分享我的示例输出:

Input the grid size: 5
Current board:
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
Input a slot player 1 from 1 to 5: 1
Current board:
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
[1, 0, 0, 0, 0]
Input a slot player 2 from 1 to 5: 2
Current board:
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
[1, 2, 0, 0, 0]
Input a slot player 1 from 1 to 5: 1
Current board:
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
[1, 0, 0, 0, 0]
[1, 2, 0, 0, 0]
Input a slot player 2 from 1 to 5: 2
Current board:
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
[1, 2, 0, 0, 0]
[1, 2, 0, 0, 0]
Input a slot player 1 from 1 to 5: 1
Current board:
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
[1, 0, 0, 0, 0]
[1, 2, 0, 0, 0]
[1, 2, 0, 0, 0]
Input a slot player 2 from 1 to 5: 2
Current board:
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
[1, 2, 0, 0, 0]
[1, 2, 0, 0, 0]
[1, 2, 0, 0, 0]
Input a slot player 1 from 1 to 5: 1
Current board:
[0, 0, 0, 0, 0]
[1, 0, 0, 0, 0]
[1, 2, 0, 0, 0]
[1, 2, 0, 0, 0]
[1, 2, 0, 0, 0]
Input a slot player 2 from 1 to 5: 2
Current board:
[0, 0, 0, 0, 0]
[1, 2, 0, 0, 0]
[1, 2, 0, 0, 0]
[1, 2, 0, 0, 0]
[1, 2, 0, 0, 0]
Input a slot player 1 from 1 to 5: 1
Current board:
[1, 0, 0, 0, 0]
[1, 2, 0, 0, 0]
[1, 2, 0, 0, 0]
[1, 2, 0, 0, 0]
[1, 2, 0, 0, 0]
Player 1 has won


可以看出,这不会以4个匹配项(匹配4)退出,而是需要整个列(此处显示的5个元素)或行进行匹配。

在这种情况下,使用any而不是all实际起作用。All只是为所有行/列打印1

def check_won(grids, user, n):
    cnt = 0
    for grid in grids:
        if any(cell == user for cell in grid):
            cnt += 1
            if cnt == 4:
                return True
    return False

这不是一个列表理解,它在找到匹配项时会停止迭代(内部
all
检查在找到不匹配项时也会停止迭代)。事实上,正是因为您没有使用列表理解(而是生成器表达式),
any
all
能够以这种方式短路。哦,等等。您希望在给定的
网格
列表中查找至少4个匹配项,并在有4个匹配项时停止?您发布了一个函数,而不是一个方法。方法属于类。普通方法将
self
作为其第一个参数。请提供两个预期返回值的示例输入数据。这不是列表理解,而是所有这些相关的“理解”结构、列表理解、生成器表达式(您在这里使用的)、字典理解、集合理解。。。它们被设计用来表示映射/过滤操作,并且没有提供提前退出的干净方法。这通常取决于消耗这些表达式结果的内容。您可以为生成器表达式编写一个consumer,该表达式在生成四个真值后立即结束,这对于生成器的惰性求值非常有效。如果我将所有值替换为任何值,则您以前的解决方案都可以工作
如果有(单元格==网格中单元格的用户):
@coderWorld但您想要匹配4,这是连续的,这就是为什么我选择了这个而不是我想要匹配一行中的4。我的对角线检查如下:
def diagcheck_-won(grids,user,n):返回全部(grids[x][x]==范围(4)内x的用户)
@coderWorld,它只匹配grids[0][0]、grids[1][1]、grids[2][2]、grids[3]。那么网格[x][x]呢,其中x是1,2,3,4?哦。你说得对!还有什么建议可以改进上面的对角线检查吗?另外,请使用任意选项切换回上一个答案,该选项按预期工作。我会接受的。