68

我的代码用于井字游戏并检查平局状态,但我认为这个问题在一般意义上可能更有用。

我有一个代表董事会的列表,它看起来像这样:

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 标记的组合占用?

4

1 回答 1

136

通常来说,一般来说:

all并且any是需要一些可迭代和返回的函数True,如果

  • 在 的情况下all(),iterable 中没有任何值是虚假的;
  • 在 的情况下any(),至少有一个值为真。

一个值x是假的 iff bool(x) == False。一个值x是真实的 iff bool(x) == True

可迭代对象中的任何非布尔值都可以——将根据以下规则bool(x)映射(或强制,如果您愿意)任何对象: , , , , , ,和其他空集合映射到, 其他任何对象到. 文档字符串使用术语 'true'/'false' 表示“truthy”/“falsy”,使用/表示具体的布尔值。x00.0None[]()[]set()FalseTrueboolTrueFalse


在您的特定代码示例中:

您误解了这些功能的工作原理。因此,以下内容完全不是您想的那样:

if any(foobars) == big_foobar:

...因为any(foobars)将首先评估为Trueor False,然后将该布尔值与 进行比较big_foobar,这通常总是给你False(除非big_foobar碰巧碰巧是相同的布尔值)。

注意: iterable 可以是一个列表,但它也可以是一个生成器/生成器表达式(≈ 懒惰评估/生成的列表)或任何其他迭代器。

你想要的是:

if any(x == big_foobar for x in foobars):

它基本上首先构造一个产生一系列布尔值的迭代——对于 中的每个项目foobars,它将项目与该项目进行比较并将big_foobar结果布尔值发送到结果序列中:

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

另见:http ://docs.python.org/2/library/functions.html#all

于 2013-10-06T17:45:19.580 回答