python中的all()如何在空列表上工作

时间:2013-10-26 01:25:19

标签: python python-2.7 list-comprehension

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

5 个答案:

答案 0 :(得分:19)

这是真的,因为对于列表中的每个元素,它们全部为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在被证明是无辜之前是有罪的。

答案 1 :(得分:4)

考虑all的递归定义:

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

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

另一种看待它的方法是,对于L 为真的任何列表all(L),我们应该能够识别至少一个元素{{ 1}},这不是真的。但是,当a为空时,a中没有此类L,因此我们有理由说L为真。

相同的论点适用于all([])。如果any为真,我们应该能够确定any(L)中至少有一个元素是真的。但是,由于我们不能列出空列表L,我们可以说L是错误的。 any([])的递归实现支持这一点:

any

如果def any(L): if L: return L[0] or any(L[1:]) else: return False 为真,我们可以在不进行递归调用的情况下返回true,因此假设L[0]为false。我们达到基本情况的唯一方法是,如果L[0]的元素不是真的,那么 如果我们达到它,我们必须返回L

答案 2 :(得分:4)

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

>>> all([])
True

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

答案 3 :(得分:0)

来自office documents

全部(可迭代)
如果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版的新功能。

答案 4 :(得分:0)

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

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