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