我知道这有充分的理由,但我想知道是什么原因?
>>> print all([])
True
如果all()旨在检查iterable上的每个项目是否评估为“True”,并且我们知道空列表被评估为False
>>> bool([])
False
为什么all()为空列表返回True?
<编辑>
我已经阅读了文档,我知道了实现
def all(iterable):
for element in iterable:
if not element:
return False
return True
但问题是为什么不呢?
def all(iterable):
if not iterable:
return False
for element in iterable:
if not element:
return False
return True
这有一个逻辑吗?如果你有一个完成任务列表
today_todo_status = [task.status for task in my_todo if task.date == today]
can_i_go_home = all(today_todo_status)
好的,在上面的假设的示例中,如果我没有任务,那么它真的很有意义,所以我可以回家。
但还有其他情况,我不认为所有()都是为todo列表制作的.LOL
< / edit>
答案 0 :(得分:30)
这表示为“对于S中的所有X,X为真”。如果S为空,则没有X.但是,真实陈述仍然是真的,因为对于所有X,X都是真的......那里没有任何X!
以下是using logic的解释。
考虑两组A和B,其中A + B是两组的并集。
如果有(A + B)=真 - >任何(A)或任何(B)=真,但我们不能断言 任何(A)=真或任何(B)=真。
如果有(A + B)=假 - >任何(A)=假,任何(B)=假。
如果所有(A + B)=真 - > all(A)= True,all(B)= True
如果所有(A + B)=假 - > all(A)= False或all(B)= False但我们不能断言all(A)= False或all(B)= False。
现在代替B,让我们将空集0添加到A.我们想要出现 逻辑使得添加空集不会改变值 all()或any(),因为A + 0 = A。
任何(A + 0)=任何(A)或任何(0)
any(0)必须为False,因此如果任何(A)为True,则任何(A + 0)为True,并且 如果任何(A)为假,则任何(A + 0)为假。
全部(A + 0)=全部(A)和全部(0)
如果所有(A)都为真,则所有(A + 0)为真。因此,all(0)为True。
答案 1 :(得分:9)
all()
(如果迭代的所有元素都为真(或者如果可迭代为空),则记录到" 返回True。&# 34;)相当于以下内容:
def all(iterable):
for element in iterable:
if not element:
return False
return True
由于没有元素,它将跳过循环并返回True
。
答案 2 :(得分:1)
因为所有元素都是True。如果没有元素,您可以说“所有元素都是......任何东西'
答案 3 :(得分:1)
这来自数学逻辑。
“空集的元素一切都是真的”(http://en.wikipedia.org/wiki/Empty_set)
答案 4 :(得分:0)
ELI5版本。
获取数字列表
L = [1,2,3,4,6]
all([isintance(l, int) for l in L])
all
的定义方式是,使其成为False
的唯一方法是提供at least
一个非整数。
类似地定义any
的方式是,使它True
为at-least
一个正整数。
由于all()
是any()
的补码,一个必须为True
,而另一个必须为False
答案 5 :(得分:0)
在测试条件时,我们希望始终将第一个元素添加到列表中。例如,如果我们只想将小于或小于最小的数字添加到列表中,则可以这样做:
def addToList(less,num):
if less:
if any( num >= savedNum for savedNum in numbers):
print('{} is not less'.format(num))
return
elif any( num <= savedNum for savedNum in numbers):
print('{} is not greater'.format(num))
return
numbers.append(num)
numbers = []
doLess = True
doMore = False
addToList(doLess,5) #numbers is empty, but will be added
addToList(doLess,2)
addToList(doLess,7)
addToList(doMore,15)
addToList(doMore,9)
print(numbers)
输出:
7 is not less [5, 2]
9 is not greater [5, 2, 15]
[5, 2, 15]
答案 6 :(得分:0)
假设all([])
是False
。
然后,对于所有非空列表A
,all(A + [])
也应为False
,
all(A + []) = all(A) and all([])
= all(A) and False
= False
自A + [] = A
起,我们知道
all(A + []) = all(A) for any non empty list A
但是,all(A)
可能是True
(例如A = [True]
)
因此
对于所有非空列表
A
,all(A + [])
也应为False
这是矛盾的。结果,第一个假设是错误的,并且
all([])
是True