Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用any()和all()检查列表是否包含一组值或另一组值_Python_List - Fatal编程技术网

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

Python 使用any()和all()检查列表是否包含一组值或另一组值,python,list,Python,List,我的代码是一个井字游戏和检查抽签状态,但我认为这个问题在一般意义上可能更有用 我有一个代表董事会的列表,如下所示: board = [1,2,3,4,5,6,7,8,9] 当一个玩家移动时,他们移动的int被他们的标记('x'或'o')替换,我已经有了检查来寻找获胜状态,我不能做的是检查平局状态,其中列表值都不是int,但还没有设置获胜状态 到目前为止,我掌握的代码是: if any(board) != playerOne or any(board) != playerTwo: pri

我的代码是一个井字游戏和检查抽签状态,但我认为这个问题在一般意义上可能更有用

我有一个代表董事会的列表,如下所示:

board = [1,2,3,4,5,6,7,8,9]
当一个玩家移动时,他们移动的int被他们的标记('x'或'o')替换,我已经有了检查来寻找获胜状态,我不能做的是检查平局状态,其中列表值都不是int,但还没有设置获胜状态

到目前为止,我掌握的代码是:

if any(board) != playerOne or any(board) != playerTwo:
    print 'continue'
elif all(board) == playerOne or playerTwo:
    print 'Draw'
if语句起作用,elif不起作用,我想问题在于我的'or'运算符,我要检查的是:如果板上的每个项目都是playerOne标记或playerTwo标记,如果我在哪里生成代码:

elif all(board) == playerOne or all(board) == playerTwo:
我会检查棋盘上的每个位置是playerOne还是playerTwo,但事实并非如此


那么,如何检查棋盘是否由playeron标记和playerTwo标记的组合占据?

一般来说:

if any(x == big_foobar for x in foobars):
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
all
any
是一些函数,它们接受一些iterable并返回
True
,如果

  • all()
    的情况下,iterable中的值不存在错误
  • 对于
    any()
    ,至少有一个值是真实的
x
为falsy iff
bool(x)=False
。 值
x
为真值
bool(x)=True

iterable中的任何非布尔值都可以-
bool(x)
将根据以下规则映射(或强制,如果您愿意):
0
0.0
None
[]
()
[]
set()
,以及其他空集合映射到
False
,还有什么事要告诉
True
bool
的docstring使用术语'true'/'false'表示'truthy'/'falsy',
true
/
false
表示具体的布尔值


在您的特定代码示例中:

if any(x == big_foobar for x in foobars):
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
您对这些函数的工作原理有一点误解。因此,以下内容与您的想法完全不同:

if any(foobars) == big_foobar:
…因为
any(foobar)
将首先计算为
True
False
,然后将该布尔值与
big\u foobar
进行比较,后者通常会给出
False
(除非
big\u foobar
恰好是相同的布尔值)

注意:iterable可以是列表,也可以是生成器/生成器表达式(≈ 延迟计算/生成列表)或任何其他迭代器

您想要的是:

if any(x == big_foobar for x in foobars):
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
它首先构造一个iterable,为
foobars
中的每个项目生成一个布尔值序列,然后将该项目与
big_foobar
进行比较,并将结果布尔值发送到结果序列中:

tmp = (x == big_foobar for x in foobars)
然后
any
遍历
tmp
中的所有项目,并在找到第一个truthy元素后返回
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表示x在xs中)
相当于
y在xs中
但后者更可读、写得更快、运行得更快

一些示例:

if any(x == big_foobar for x in foobars):
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

另请参见:

这实际上不是如何工作的:“返回
True
如果iterable的(任何/所有)元素为True。如果iterable为空,则返回False。”我认为与其使用
any(x==foobar中x的big\u foobar)
不如在foobar中编写
big\u foobar
。好的,来更改我的行:如果有的话(board)玩家指南或任何(棋盘)!=playerTwo:这会变成:如果有(x!=玩家指南或x!=棋盘上x的playerTwo):@DSM:当然,但我必须以他的用例为基础:)@DasSnipez:这意味着“如果棋盘上存在不属于任何一个玩家的物品”。。。所以如果那是你想要的,是的。