python使用any()和all()来检查列表是否包含一组值或另一组

Das*_*pez 32 python list

我的代码用于Tic Tac Toe游戏并检查绘制状态,但我认为这个问题在一般意义上可能更有用.

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

board = [1,2,3,4,5,6,7,8,9]
Run Code Online (Sandbox Code Playgroud)

当一个玩家移动时,他们移动的int被替换为他们的标记('x'或'o'),我已经有检查到位以寻找获胜状态,我不能做的是检查抽签state,其中没有列表值是整数但是尚未设置获胜状态.

我到目前为止的代码:

if any(board) != playerOne or any(board) != playerTwo:
    print 'continue'
elif all(board) == playerOne or playerTwo:
    print 'Draw'
Run Code Online (Sandbox Code Playgroud)

if语句有效,elif没有,我认为问题是我的'或'运算符,我要检查的是:如果主板上的每个项目都是playerOne标记或playerTwo标记,如果我在哪里做码:

elif all(board) == playerOne or all(board) == playerTwo:
Run Code Online (Sandbox Code Playgroud)

我会检查看板上的每个位置是否为playerOne或者板上的每个位置都是playerTwo,它不会.

那么如何通过playerOne标记和playerTwo标记的组合来检查棋盘是否被占用?

Eri*_*lun 66

all并且any是可迭代的函数并确定...

  • ...在以下情况下True:如果该可迭代中的所有值都是非all();
  • ...在以下情况下any():如果该可迭代中的任何值为非x.

在空迭代的情况下,上述定义也是有意义的,否则可以更自然地说bool(x) == False看到所有值是否为真,并且x看到是否有任何值为真.


所以你误解了这些功能的工作原理.因此,以下内容完全不符合您的想法:

if any(foobars) == big_foobar:
Run Code Online (Sandbox Code Playgroud)

...因为bool(x) == True首先会被评估为any(foobars)或者True,然后将该布尔值进行比较False,这通常总是给你big_foobar(除非False碰巧是相同的布尔值).

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

你想要的是:

if any(x == big_foobar for x in foobars):
Run Code Online (Sandbox Code Playgroud)

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

tmp = (x == big_foobar for x in foobars)
Run Code Online (Sandbox Code Playgroud)

然后big_foobar遍历所有项目anytmp在找到第一个True项目后立即返回.就好像你做了以下事情:

foobars = ['big', 'small', 'medium', 'nice', 'ugly']
big_foobar = 'big'
any(['big' == big_foobar, 'small' == big_foobar, 'medium' == big_foobar, ...])
Run Code Online (Sandbox Code Playgroud)

注意:正如DSM指出的那样,True相当于any(x == y for x in xs)但后者更易读,写得更快,运行速度更快.

一些例子:

any(x > 5 for x in range(4))  # => False
all(isinstance(x, int) for x in range(10))  # => True
any(x == 'Erik' for x in ['Erik', 'John', 'Jane', 'Jim'])  # => True
all([True, True, True, False, True])  # => False
Run Code Online (Sandbox Code Playgroud)

我强烈建议简单地在Python shell上使用y in xsany使用各种输入,或者更好的是,在IPython shell上,在继续编写实际代码之前了解其工作原理.

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

  • 我认为不是'any(对于foobars中的x为x == big_foobar)`而是在foobars中写'big_foobar'更为惯用. (4认同)