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

Posted

技术标签:

【中文标题】python中的all()如何处理空列表【英文标题】:How does all() in python work on empty lists 【发布时间】:2013-11-05 06:39:58 【问题描述】:

我指的是下面的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 的元素吗?

【问题讨论】:

Reason for "all" and "any" result on empty lists 的可能重复项 【参考方案1】:

这是真的,因为对于列表中的每个元素,所有元素都是 0,它们都等于 2。

你可以认为all被实现为:

def all(list, condition):
  for a in list:
    if not condition(a):
      return false
  return true

而any 是:

def any(list, condition):
  for a in list:
    if condition(a):
      return true
  return false

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

【讨论】:

喜欢这个比喻!谢谢你:)【参考方案2】:

应用于空列表的“全部”是“空虚的”,这很容易确认:

>>> all([])
True

同样,“如果 0 = 1,那么月亮是方形的”也是正确的。更一般地说,“所有 P 都是 Q”——如果没有 P,则该陈述被认为是正确的,因为它可以被正式地捕获为“对于所有 x,如果 x 是 P,则 x 是 Q”。最终,这些都是真的,因为只要前提(第一个子句)为 False,条件逻辑运算符(if-then)的计算结果为 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)

【讨论】:

【参考方案3】:

考虑递归定义all

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

如果L 中的每个元素都为真,那么L 中的第一项必须为真,并且all(L[1:]) 中的第一项为真。这对于包含多个项目的列表很容易看到,但是对于具有 one 项目的列表呢?显然,如果唯一一项为真,则每一项都为真,但在这种情况下,我们的递归公式如何工作?将 all([]) 定义为 true 会使算法工作。

另一种看待它的方式是,对于all(L)为真的任何列表L,我们应该能够识别至少一个元素a,它是不对。但是,L 为空时,L 中没有这样的a,所以我们有理由说all([]) 是真的。

相同的参数适用于any。如果any(L) 为真,我们应该能够识别L 中至少一个为真的元素。但是由于我们不能为空列表L,我们可以说any([]) 是假的。 any 的递归实现支持这一点:

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

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

【参考方案5】:

来自office documents。

所有(可迭代) 如果可迭代对象的所有元素都为真(或可迭代对象为空),则返回 True。相当于:

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

2.5 版中的新功能。

任何(可迭代) 如果可迭代的任何元素为真,则返回 True。如果可迭代对象为空,则返回 False。相当于:

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

2.5 版中的新功能。

【讨论】:

以上是关于python中的all()如何处理空列表的主要内容,如果未能解决你的问题,请参考以下文章

使用 protobuf-net 序列化数组时如何处理空值?

string.Format 如何处理空值?

RestKit:如何处理空的 response.body?

加入多个表后如何处理空值

从 Spark 写入镶木地板时如何处理空值

如何处理空的“DataFrame”:没有数字数据来绘制错误以在图表上获取字符串