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

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

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

一般来说:

all
并且
any
是需要一些迭代并返回的函数
True
,如果

  • 在的情况下
    all()
    ,迭代器中的任何值都不是虚假的;
  • 在的情况下
    any()
    ,至少一个值是真实的。

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

在迭代将被罚款的任何非布尔值-

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


在您的特定代码示例中:

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

if any(foobars) == big_foobar:

…因为

any(foobars)
首先会被评估为
True
False
,然后将该布尔值与进行比较
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
遍历所有项目,
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

注意: 正如DSM所指出的,

any(x == y for x in xs)
等同于,
y inxs
但后者更具可读性,编写速度更快,运行速度更快。

一些例子:

In [1]: any(x > 5 for x in range(4))Out[1]: FalseIn [2]: all(isinstance(x, int) for x in range(10))Out[2]: TrueIn [3]: any(x == 'Erik' for x in ['Erik', 'John', 'Jane', 'Jim'])Out[3]: TrueIn [4]: all([True, True, True, False, True])Out[4]: False

另请参阅:http :
//docs.python.org/2/library/functions.html#all



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5630256.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存