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
,如果
- 在
的情况下,iterable中的值不存在错误李>all()
- 对于
,至少有一个值是真实的any()
x
为falsy iffbool(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:这意味着“如果棋盘上存在不属于任何一个玩家的物品”。。。所以如果那是你想要的,是的。