python中的all()如何处理空列表
Posted
技术标签:
【中文标题】python中的all()如何处理空列表【英文标题】:How does all() in python work on empty lists 【发布时间】:2013-11-05 06:39:58 【问题描述】:我指的是下面的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 的元素吗?
【问题讨论】:
Reason for "all" and "any" result on empty lists 的可能重复项 【参考方案1】:这是真的,因为对于列表中的每个元素,所有元素都是 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
在被证明无罪之前是有罪的。
【讨论】:
喜欢这个比喻!谢谢你:)【参考方案2】:应用于空列表的“全部”是“空虚的”,这很容易确认:
>>> all([])
True
同样,“如果 0 = 1,那么月亮是方形的”也是正确的。更一般地说,“所有 P 都是 Q”——如果没有 P,则该陈述被认为是正确的,因为它可以被正式地捕获为“对于所有 x,如果 x 是 P,则 x 是 Q”。最终,这些都是真的,因为只要前提(第一个子句)为 False,条件逻辑运算符(if-then)的计算结果为 True:“if False then True”计算结果为 True。回想一下“if A then B”等价于“(not A) or B”。
1-2022 年添加
对于all
和Python 列表,all(my_list)
的布尔值是
"for all items `x` in `my_list`, the value of `x` is truthy".
当my_list
为空时,该值为True。同样,“for all”和all
不主张存在。
在 Python 伪代码中,all
的工作方式大致如下:
val = True
for x in my_list:
if not x:
val = False
break
# assert val == all(my_list)
【讨论】:
【参考方案3】:考虑递归定义all
:
def all(L):
if L:
return L[0] and all(L[1:])
else:
???
如果L
中的每个元素都为真,那么L
中的第一项必须为真,并且all(L[1:])
中的第一项为真。这对于包含多个项目的列表很容易看到,但是对于具有 one 项目的列表呢?显然,如果唯一一项为真,则每一项都为真,但在这种情况下,我们的递归公式如何工作?将 all([])
定义为 true 会使算法工作。
另一种看待它的方式是,对于all(L)
为不为真的任何列表L
,我们应该能够识别至少一个元素a
,它是不对。但是,L
为空时,L
中没有这样的a
,所以我们有理由说all([])
是真的。
相同的参数适用于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
。
【讨论】:
【参考方案4】:其他答案已经很好地解释了原因。作为快速修复,您可以使用:
my_list and all(a==2 for a in my_list)
【讨论】:
【参考方案5】:来自office documents。
所有(可迭代) 如果可迭代对象的所有元素都为真(或可迭代对象为空),则返回 True。相当于:
def all(iterable):
for element in iterable:
if not element:
return False
return True
2.5 版中的新功能。
任何(可迭代) 如果可迭代的任何元素为真,则返回 True。如果可迭代对象为空,则返回 False。相当于:
def any(iterable):
for element in iterable:
if element:
return True
return False
2.5 版中的新功能。
【讨论】:
以上是关于python中的all()如何处理空列表的主要内容,如果未能解决你的问题,请参考以下文章