当前位置: 首页 > 面试题库 >

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

养振濂
2023-03-14
问题内容

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

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

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(),迭代器中的任何值都不是虚假的;
  • 在的情况下any(),至少一个值是真实的。

x是假iff bool(x) == False。值x是正确的iff bool(x) == True

在迭代将被罚款的任何非布尔值-bool(x)将迫使任何x根据这些规则:00.0None[]()[]set(),等空的集合将产生False,其他任何东西True。该docstringbool使用术语’true’/’false’表示’truthy’/’falsy’,和True/False表示具体的布尔值。

在您的特定代码示例中:

您误解了这些功能的工作原理。因此,以下操作完全无法实现您的想法:

if any(foobars) == big_foobar:

…因为any(foobars)首先会被评估为TrueFalse,然后将该布尔值与进行比较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遍历所有项目,tmpTrue在找到第一个真理元素后立即返回。就像您执行以下操作一样:

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



 类似资料:
  • 问题内容: 我想为数组中的每个值返回一个布尔值,指示它是否在array中。我猜这应该是一个标准程序,但是我找不到有关如何执行此操作的任何信息。我的尝试如下: 但是,我得到了错误: 我使用的是numpy,因此首选使用numpy或标准Python的解决方案。 问题答案: 我相信您可以使用-

  • 问题内容: 我想找出$ all是否包含所有$ search_this值并返回true或false。有什么想法吗? 问题答案: 看一下array_intersect()。

  • 问题内容: 我有两个列表,一个包含 相册,文件对的 列表,另一个仅包含有关一张照片的信息- 相册 (位置0)和 文件 (位置1) 如何查看 照片 列表是否在 照片 列表中?就像字符串一样。 相册 , 文件的 位置无关紧要,因为不会有任何 文件 等于 相册 。 问题答案: 同样喜欢字符串。不仅如此,也是 如此 。也适用于列表中的列表: 对列表的成员资格测试仅迭代列表,并对每个元素使用相等性测试以查看

  • 问题内容: 我有两个带有不同对象的列表。 我想检查list2中的元素是否存在于list2中,基于特定的属性(Object1和Object2具有(以及其他),一个共有属性(类型为Long),名为attributeSame)。 现在,我这样做是这样的: 但是我认为有一种更好,更快的方法可以做到这一点:)有人可以提出吗? 谢谢! 问题答案: 如果只需要测试基本相等性,则可以使用基本JDK来完成,而无需在

  • 我有两个不同对象的列表。 我想根据特定的属性(Object1和Object2有一个共同的属性(类型为Long),名为AttributeName),检查list2中是否存在list1中的元素。 现在,我是这样做的: 但我认为有更好更快的方法可以做到这一点:)有人能提出吗? 谢谢

  • 问题内容: 假设我创建了一个像这样的文档: 我可以使用GET / idx / type / 1检索文档: 现在,我想检查字段“ the_field”是否包含值2。我知道我可以使用term子句,但是我需要使用过滤器脚本检查它,因此我尝试了: 并没有结果: 为了测试我的mevl脚本语法是否正确,我尝试这样做: 并获得正确的结果: 我究竟做错了什么? 我认为doc [‘the_field’]。value