Python中的all()如何处理空列表

y1aodyip  于 2023-03-21  发布在  Python
关注(0)|答案(6)|浏览(171)

我指的是下面的python代码

all(a==2 for a in my_list)

如果my_list中的所有元素都是2,我希望上面的代码返回True。但是当我将my_list设置为空并以

my_list = []
all(a==2 for a in my_list)

它也返回True。我对这种行为感到困惑。它不应该返回False,因为my_list中没有值为2的元素吗?

e5nqia27

e5nqia271#

这是真的,因为对于列表中的每个元素,都是0,都等于2.
您可以将所有实现视为:

def all(my_list, condition):
  for a in my_list:
    if not condition(a):
      return False
  return True

而任何一个都是:

def any(my_list, condition):
  for a in my_list:
    if condition(a):
      return True
  return False

也就是说,all在被证明有罪之前是无辜的,而any在被证明无罪之前是有罪的。

puruo6ea

puruo6ea2#

“all”应用于空列表是“vacuously true”,这是很容易证实的:

>>> all([])
True

类似地,“if 0 = 1 then the moon is square”为真。更一般地,“all P are Q”-如果没有P,则该语句被认为是真的,因为它可以被正式捕获为“For all x,if x is P then x is Q”。最终,这些为真,因为条件逻辑运算符(if-then)在先行词(第一个子句)为False时计算为True:“if False then True”的计算结果为True。回想一下,“if A then B”等价于“(not A)or B”。

  • 添加了1-2022* 在all和Python列表的情况下,all(my_list)的布尔值是
"for all items `x` in `my_list`, the value of `x` is truthy".

my_list为空时,该值为True。同样,“for all”和all没有声明存在。
在Python伪代码中,all的工作方式大致如下:

val = True
for x in my_list:
    if not x:
        val = False
        break
# assert val == all(my_list)
7lrncoxx

7lrncoxx3#

考虑all的递归定义:

def all(L):
    if L:
        return L[0] and all(L[1:])
    else:
        ???

如果L中的每个元素都为真,那么L中的第一项为真,* 和all(L[1:])为真都必须为真。对于有几个项的列表,这很容易看出,但是对于有 * 一个 * 项的列表,情况又如何呢?显然,如果唯一的项为真,则每个项都为真。但是在这种情况下,我们的递归公式是如何工作的呢?将all([])定义为true使算法工作。
另一种看待它的方式是,对于任何all(L)not true的列表L,我们应该能够识别至少一个不为真的元素a。然而,当L为空时,L中没有这样的a,因此我们有理由说all([])为真。
同样的参数也适用于any。如果any(L)为true,我们应该能够识别L中至少一个为true的元素。但是由于我们不能识别空列表L,我们可以说any([])为false。any的递归实现支持这一点:

def any(L):
    if L:
        return L[0] or any(L[1:])
    else:
        return False

如果L[0]为true,我们可以在不进行递归调用的情况下返回true,因此假设L[0]为false。我们达到基本情况的唯一方法是如果L中没有任何元素为true,因此如果我们达到它,我们必须返回False

mum43rcc

mum43rcc4#

其他答案已经很好地解释了原因。作为快速解决方案,您可以用途:

my_list and all(a==2 for a in my_list)
w46czmvw

w46czmvw5#

办公室文件。
全部(可迭代)
如果iterable的所有元素都为true(或者iterable为空),则返回True。等效于:

def all(iterable):
    for element in iterable:
        if not element:
            return False
    return True

版本2.5中的新增功能。
任意(可迭代)
如果iterable的任何元素为true,则返回True。如果iterable为空,则返回False。等效于:

def any(iterable):
    for element in iterable:
        if element:
            return True
    return False

版本2.5中的新增功能。

x0fgdtte

x0fgdtte6#

这是一个逻辑事实,所以谈论默认函数返回值会使问题变得模糊。
对于集合S,如果以下条件成立,则布尔值all(S)被定义为true:
“x in S =〉x is true”。
如果S为空,则该条件空成立,因此all(emptyset)= true。

相关问题