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被证明是无辜之前是有罪的.
很容易确认,应用于空列表的“全部”是“非常正确”:
>>> 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”。
考虑 的递归定义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
| 归档时间: |
|
| 查看次数: |
2700 次 |
| 最近记录: |