19

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

4

5 回答 5

37

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

您可以将所有被实现为:

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

任何是:

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

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

于 2013-10-26T01:27:23.637 回答
7

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

>>> all([])
True

类似地,“如果 0 = 1 则月亮是方形的”是正确的。更一般地说,“所有 P 都是 Q”——如果没有 P,那么该陈述被认为是正确的,因为它可以正式地被捕获为“对于所有 x,如果 x 是 P,那么 x 是 Q”。最终,这些都是真的,因为只要前提(第一个子句)为假,条件逻辑运算符(if-then)的计算结果为真:“如果假则真”计算为真。回想一下“if A then B”等价于“(not A) or B”。

新增 1-2022和 Python 列表 的情况下all,布尔值all(my_list)

"for all items `x` in `my_list`, the value of `x` is truthy". 

my_list为空时,该值为 True。再次,“为所有人”,all不提出存在的主张。

在 Python 伪代码中,all大致是这样工作的:

val = True
for x in my_list:
    if not x:
        val = False
        break
# assert val == all(my_list)
于 2013-10-26T04:37:05.990 回答
4

考虑 的递归定义all

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

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

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

相同的论点适用于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如果我们达到它,我们必须返回。

于 2013-10-26T02:01:06.507 回答
1

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

my_list and all(a==2 for a in my_list)
于 2021-07-20T08:35:06.720 回答
0

办公文件

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

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

2.5 版中的新功能。

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

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

2.5 版中的新功能。

于 2020-03-25T08:05:27.057 回答