【问题标题】:How to add a limit in the generator expression Python如何在生成器表达式 Python 中添加限制
【发布时间】:2020-03-29 04:36:09
【问题描述】:

我在 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 个元素)或行来匹配。

【问题讨论】:

  • 这不是一个列表推导式,它会在找到匹配项后立即停止迭代(内部all 检查也会在找到不匹配项后立即停止迭代)。实际上,正是因为您没有使用列表推导(而是生成器表达式anyall 能够以这种方式短路。
  • 哦,等等。您想在给定的grid 列表中查找至少 4 个匹配项,并在找到 4 个后停止?
  • 您发布了一个函数,而不是一个方法。方法属于类。普通方法以self 作为第一个参数。
  • 请提供两个预期返回值的示例输入数据。
  • 这不是列表推导,而是所有这些相关的“理解”构造、列表推导、生成器表达式(您在此处使用的)、字典推导、集合推导......它们旨在表达映射/过滤操作,并提供不干净的方式提前退出。这通常取决于消耗这些表达式的结果。你可以为你的生成器表达式编写一个消费者,它会在产生四个真值后立即结束,这对于生成器的惰性求值很有效

标签: python python-3.x generator


【解决方案1】:

在这种情况下,使用 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

【讨论】:

  • 如果我将所有替换为任何,您之前的解决方案将有效。 if any(cell == user for cell in grid):
  • @coderWorld 但是你想匹配连续的 4 这就是我选择这个的原因
  • 不,我想连续匹配 4 个。我的对角线检查如下:def diagcheck_won(grids, user, n): return all(grids[x][x] == user for x in range(4))
  • @coderWorld 只匹配 grids[0][0]、grids[1][1]、grids[2][2]、grids[3][3]。那么 x 为 1,2,3,4 的 grids[x][x] 呢?
  • 哦。你是对的!有什么建议可以改善上面的对角线检查吗?另外,请使用任何按预期工作的答案切换回上一个答案。我会接受的。
猜你喜欢
  • 2019-07-11
  • 2017-12-08
  • 2020-07-08
  • 2014-04-02
  • 2021-12-27
  • 1970-01-01
  • 2016-10-12
  • 1970-01-01
  • 2021-10-17
相关资源
最近更新 更多