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

2023-12-13

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

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

board = [1,2,3,4,5,6,7,8,9]

当玩家移动时,他们移动的整数将被替换为他们的标记(“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 and any是接受一些可迭代并返回的函数True, if

  • 如果是all,迭代中没有值是假的;
  • 如果是any,至少有一个值是真实的。

A value x是假的当且仅当bool(x) == False。 一个值x是真实的当且仅当bool(x) == True.

可迭代中的任何非布尔元素都是完全可以接受的 -bool(x)地图,或强制,任何x根据这些规则:

  • 0, 0.0, None, [], (), [], set(),其他空集合映射到False
  • 所有其他值都映射到True.

文档字符串为bool使用术语“真”/“假”来表示“真”/“假”,并且True/False对于具体的布尔值。


在您的特定代码示例中:

您稍微误解了这些函数的工作原理。下面做的事情与你想象的完全不同:

if any(foobars) == big_foobar:

...因为any(foobars)首先会被评估为True or False,然后将该布尔值与big_foobar,通常总是给你False(除非big_foobar碰巧是相同的布尔值)。

Note:可迭代可以是一个列表,但它也可以是一个生成器或生成器表达式(≈延迟计算/生成的列表),或任何其他迭代器。

你想要的是:

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

它基本上首先构造一个迭代器,该迭代器为中的每个项目生成一系列布尔值foobars,它将该项目与所持有的值进行比较big_foobar,并且(惰性地)将生成的布尔值发送到生成的布尔值序列中:

tmp = (x == big_foobar for x in foobars)

then 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

Note:正如帝斯曼指出的,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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • CursorAdapter如何在android上的GridView中工作

    我在 gridview 上使用光标适配器时遇到问题 我使用光标从媒体商店加载照片 我意识到我的 newView 和 bindView 被完全调用了 我的意思是假设我有 500 张照片 newView 也会被调用相同的次数 我做错了什么吗 我
  • TPL 和 async/await 之间的区别(线程处理)

    尝试了解 TPL 和 TPL 之间的区别async await当谈到线程创建时 我相信 TPL TaskFactory StartNew 的工作原理类似于ThreadPool QueueUserWorkItem因为它在线程池中的线程上排队工
  • JSOUP HTML 解析器

    有没有办法得到起始行号和列号 and 结束行号和列号元素 标签 我正在创建 HTML 编辑器 需要突出显示标签以根据给定的某些场景进行速度优化起始和结束行号和列号 不 不幸的是 目前 jsoup 无法做到这一点 目前 Jsoup 不跟踪行号
  • Facebook Connect 和相册

    我目前正在为模特 演员开发一个网站 此时我只是想确定我可以使用 Facebook Connect 做什么和不能做什么 我几乎没有使用 Facebook Connect 或 FQL 的经验 基本上将会有一个设施 用户可以上传他们的照片 我想知
  • 在Android中播放Vimeo视频,视频url包含iframe

    你好 我正在开发 Android 应用程序 我想在其中播放 vimeo 视频 我从 json 中的 Api 获得响应 并使用 webview 播放视频 并且播放效果很好 但是 webview 显示非常小 播放的视频也很小 问题是 我希望播放
  • Mysql更改默认引擎

    如何将mysql引擎改为MYISAM 现在我有 INNODB 的 mysql 但我想将引擎更改为 MYISAM 我必须做什么 CREATE TABLE classifieds category id int 11 NOT NULL AUTO
  • laravel新建数据时无法按类别保存计算数据

    模型花费时间 在 laravel 中创建新数据时 无法按类别保存计算数据 public static function findOrCreate plan id data fromDate Carbon now gt subDay gt s
  • Android主项目与库项目-如何在项目之间传递设置

    刚刚开始使用 Android 我正在尝试创建一个具有免费和付费版本的应用程序 我也是 Java 新手 但我成功地在 Eclipse 中创建了一个简单的工作应用程序 它由 2 个主要项目组成 一个是免费版本 一个是付费版本 我还有一个库项目
  • 如何获取字符串中所有出现 Ruby 正则表达式的匹配数据?

    我需要MatchData对于字符串中正则表达式的每次出现 这与中建议的扫描方法不同匹配正则表达式的所有出现 因为这只给了我一个字符串数组 我需要完整的 MatchData 以获取开始和结束信息等 input abc12def34ghijkl
  • 在数据库中存储时间 (hh:mm) 的最佳方法

    我想将时间存储在数据库表中 但只需要存储小时和分钟 我知道我可以只使用 DATETIME 并忽略日期的其他组成部分 但是在不存储超出我实际需要的信息的情况下执行此操作的最佳方法是什么 您可以将其存储为午夜过后分钟数的整数 eg 0 00 0
  • 如果我包含某个包,Flutter Android 应用程序会在启动时崩溃

    最近突然出现了一个问题 只需将依赖项包含在 pubspec yaml 中的 位置 中 例如 dependencies flutter sdk flutter location 1 2 0 lt culprit firebase auth 0
  • 最短的GAS ARM (linux) 程序?

    我曾考虑过学习汇编语言 并决定尝试一下 ARM 我决定使用 GNU 汇编器 主要是因为它可以在我的手机存储库中找到 这样如果我感到无聊 我可以在任何地方尝试汇编 无论如何 我在网上搜索过 但找不到任何有关如何正确退出 ARM Linux 二
  • Java - 为什么强制垃圾收集不释放内存

    我正在生成一个大型数据结构并将其写入硬盘 之后我想摆脱该对象 以减少内存消耗 我的问题是 在强制垃圾收集之后 已用内存量至少与垃圾收集之前一样高 我添加了一个我正在做的最小工作示例 DataStructure data new DateSt
  • 在华为开发者控制台中为华为应用添加关键字

    我需要为用户提供在华为应用程序库中搜索我的应用程序的能力 就像苹果在应用程序商店中的关键字一样 但我在华为开发者控制台中找不到与之等效的内容 华为提供多种广告类型来帮助您增加Android应用的下载量 您可以设置字词或短语 使您的广告与用户
  • 如何将一个表单的实例传递给另一个表单

    我有一个名为form1带有在运行时创建的控件 当我按下表单上的按钮时 另一个表单会加载 称为combat and form1被隐藏 因此只有 1 种形式 combat 可见 当我按下按钮时combat我想要我的form1形成所显示的 但是我
  • jQuery 方法不适用于事件处理程序中的“this”

    当我使用下面的方法时 我无法获取 jQuerythis隐藏该元素 purplePanda click function e this hide 我收到此错误 Uncaught TypeError this hide is not a fun
  • 参数通过 ByVal 传递给 VB.NET 函数并在那里进行操作

    在此 Microsoft 示例中 将 Double 数组传递给函数MultiplyMatricesSequential and MultiplyMatricesParallel 作为参数结果使用ByVal修饰符 http msdn micr
  • Flutter:忽略小部件上的触摸事件

    我希望在其他小部件之上有一个模糊的图像 但是 当我这样做时 我无法与它下面的小部件进行交互 Solution 您可以解决您的交互问题 无法与Widget在你的模糊图像下方 通过包围你的BackdropFilter与IgnorePointer
  • 如何在支持8位无符号整数的设备上合法显示DICOM 16无符号整数?

    我正在 iOS 上开发一个医疗应用程序 iOS 设备仅支持 GL UNSIGNED BYTE 和 GL LUMINANCE 或者通常仅支持每个组件 8 位 现在我有一些灰度图像是 16 位无符号整数 我想显示它们 我发现我们无法显示 16
  • 使用any()和all()检查列表是否包含一组值或另一组值

    我的代码是针对井字游戏并检查平局状态的 但我认为这个问题在一般意义上可能更有用 我有一个代表董事会的列表 它看起来像这样 board 1 2 3 4 5 6 7 8 9 当玩家移动时 他们移动的整数将被替换为他们的标记 x 或 o 我已经进