How does all() in python work on empty lists

qui*_*ack 14 python list-comprehension python-2.7

I am referring to the following python code

all(a==2 for a in my_list)
Run Code Online (Sandbox Code Playgroud)

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

my_list = []
all(a==2 for a in my_list) 
Run Code Online (Sandbox Code Playgroud)

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

Omn*_*ity 24

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

您可以将所有实现视为:

def all(list, condition):
  for a in list:
    if not condition(a):
      return false
  return true
Run Code Online (Sandbox Code Playgroud)

任何是:

def any(list, condition):
  for a in list:
    if condition(a):
      return true
  return false
Run Code Online (Sandbox Code Playgroud)

也就是说,在all被证明有罪之前是无辜的,并且在any被证明是无辜之前是有罪的.

  • 喜欢这个比喻!感谢那 :) (3认同)

Bri*_*anO 6

很容易确认,应用于空列表的“全部”是“非常正确”:

>>> all([])
True
Run Code Online (Sandbox Code Playgroud)

同样,“如果0 = 1则月亮为正方形”为真。更笼统地说,“所有P都是Q”-如果没有P,则该语句被认为是正确的,因为它可以被正式地捕获为“对于所有x,如果x是P则x是Q”。最终,它们是正确的,因为只要前提条件(第一个子句)为False,条件逻辑运算符(if-then)就会计算为True:“如果为False,则为True”则计算为True。回想一下,“如果是A则B”等效于“(不是A)或B”。


che*_*ner 5

考虑 的递归定义all

def all(L):
    if L:
        return L[0] and all(L[1:])
    else:
        ???
Run Code Online (Sandbox Code Playgroud)

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

另一种看待它的方式是,对于任何不正确的列表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
Run Code Online (Sandbox Code Playgroud)

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