我指的是以下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的元素?
答案 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)
全部(可迭代)
如果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)