我的代码用于井字游戏并检查平局状态,但我认为这个问题在一般意义上可能更有用。
我有一个代表棋盘的列表,它看起来像这样:
board = [1,2,3,4,5,6,7,8,9]
当玩家移动时,他们移动的 int 被替换为他们的标记('x' 或 'o'),我已经有检查来寻找获胜状态,我不能做的是检查对于平局状态,列表值都不是整数,但尚未设置获胜状态。
我目前的代码:
if any(board) != playerOne or any(board) != playerTwo:
print 'continue'
elif all(board) == playerOne or playerTwo:
print 'Draw'
if 语句有效,elif 无效,我认为问题是我的“或”运算符,我要检查的是:如果板上的每个项目都是 playerOne 标记或 playerTwo 标记,如果我在哪里制作代码:
elif all(board) == playerOne or all(board) == playerTwo:
我会检查棋盘上的每个位置是 playerOne 还是棋盘上的每个位置都是 playerTwo,但它不会是。
那么如何检查棋盘是否被 playerOne 标记和 playerTwo 标记的组合占用?
最佳答案
一般来说:
all
和 any
是接受一些可迭代并返回 True
的函数,如果
- 在
all()
的情况下,iterable 中没有任何值是假的; - 对于
any()
,至少有一个值为真。
当 bool(x) == False
时,值 x
是假的。
当 bool(x) == True
时,值 x
为真。
iterable 中的任何非 bool 值都可以——bool(x)
将根据以下规则映射(或强制,如果您愿意)任何 x
:0
、0.0
、无
、[]
、()
、[ ]
、set()
和其他空集合被映射到 False
,其他任何东西都映射到 True
。 bool
的文档字符串使用术语 'true'/'false' 表示 'truthy'/'falsy',使用 True
/False
表示具体的 bool 值。
在您的特定代码示例中:
您对这些函数的工作方式有一点误解。因此,以下内容完全不是您想的那样:
if any(foobars) == big_foobar:
...因为 any(foobars)
将首先被评估为 True
或 False
,然后将比较该 bool 值到 big_foobar
,它通常总是给你 False
(除非 big_foobar
碰巧是同一个 bool 值)。
注意:可迭代对象可以是列表,但也可以是生成器/生成器表达式(≈ 延迟评估/生成的列表)或任何其他迭代器。
你想要的是:
if any(x == big_foobar for x in foobars):
它首先构造一个产生一系列 bool 值的可迭代对象——对于 foobars
中的每个项目,它会将项目与 big_foobar
进行比较,并将结果 bool 值发送到结果中顺序:
tmp = (x == big_foobar for x in foobars)
然后 any
遍历 tmp
中的所有项目,并在找到第一个真实元素后立即返回 True
。就好像你做了以下事情:
In [1]: foobars = ['big', 'small', 'medium', 'nice', 'ugly']
In [2]: big_foobar = 'big'
In [3]: any(['big' == big_foobar, 'small' == big_foobar, 'medium' == big_foobar, 'nice' == big_foobar, 'ugly' == big_foobar])
Out[3]: True
注意:正如 DSM 指出的那样,any(x == y for x in xs)
等价于 y in xs
但后者更具可读性,编写速度更快,运行速度更快。
一些例子:
In [1]: any(x > 5 for x in range(4))
Out[1]: False
In [2]: all(isinstance(x, int) for x in range(10))
Out[2]: True
In [3]: any(x == 'Erik' for x in ['Erik', 'John', 'Jane', 'Jim'])
Out[3]: True
In [4]: all([True, True, True, False, True])
Out[4]: False
关于python - 使用 any() 和 all() 检查列表是否包含一组值或另一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19211828/