我正在尝试了解 any()
和 all()
Python 内置函数的工作原理。
我正在尝试比较元组,以便如果任何值不同,它将返回 True
,如果它们都相同,它将返回 False
。在这种情况下,他们如何返回 [False, False, False]?
d
是一个 defaultdict(list)
。
print d['Drd2']
# [[1, 5, 0], [1, 6, 0]]
print list(zip(*d['Drd2']))
# [(1, 1), (5, 6), (0, 0)]
print [any(x) and not all(x) for x in zip(*d['Drd2'])]
# [False, False, False]
据我所知,这应该输出
# [False, True, False]
因为(1,1)相同,(5,6)不同,(0,0)相同。
为什么所有元组的评估结果都为 False?
见 Pythonic way of checking if a condition holds for any element of a list any
的实际用法。
最佳答案
您可以粗略地将 any
和 all
分别视为一系列逻辑 or
和 and
运算符。
任何
any
将在至少有一个元素 为Truthy 时返回True
。阅读 Truth Value Testing.
全部
all
仅当 所有元素 为真时才会返回 True
。
真值表
+-----------------------------------------+---------+---------+
| | any | all |
+-----------------------------------------+---------+---------+
| All Truthy values | True | True |
+-----------------------------------------+---------+---------+
| All Falsy values | False | False |
+-----------------------------------------+---------+---------+
| One Truthy value (all others are Falsy) | True | False |
+-----------------------------------------+---------+---------+
| One Falsy value (all others are Truthy) | True | False |
+-----------------------------------------+---------+---------+
| Empty Iterable | False | True |
+-----------------------------------------+---------+---------+
注1:空的iterable case在官方文档中有解释,是这样的
any
Return
True
if any element of the iterable is true. If the iterable is empty, returnFalse
由于没有一个元素为真,在这种情况下它返回 False
。
all
Return
True
if all elements of the iterable are true (or if the iterable is empty).
由于没有一个元素是假的,在这种情况下它返回 True
。
注2:
关于 any
和 all
的另一件重要的事情是,当他们知道结果时,它会短路执行。优点是,不需要消耗整个可迭代对象。例如,
>>> multiples_of_6 = (not (i % 6) for i in range(1, 10))
>>> any(multiples_of_6)
True
>>> list(multiples_of_6)
[False, False, False]
这里,(not (i % 6) for i in range(1, 10))
是一个生成器表达式,如果当前数字在 1 以内,则返回 True
并且9是6的倍数。any
迭代multiples_of_6
,当遇到6
时,找到一个Truthy值,所以立即返回True
,multiples_of_6
的其余部分未迭代。这就是我们打印 list(multiples_of_6)
时看到的,7
、8
和 9
的结果。
这个好东西在this answer中用的非常巧妙.
有了这个基本的了解,如果我们看看你的代码,你就会明白
any(x) and not all(x)
这确保至少有一个值是真实的,但不是全部。这就是它返回 [False, False, False]
的原因。如果你真的想检查两个数字是否不相同,
print [x[0] != x[1] for x in zip(*d['Drd2'])]
https://stackoverflow.com/questions/19389490/