我试图了解 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?
有关 any
的实际用法,请参阅 检查条件是否适用于列表的任何元素的 Pythonic 方法。
原文由 O.rka 发布,翻译遵循 CC BY-SA 4.0 许可协议
您可以粗略地认为
any
和all
是一系列逻辑运算符or
和and
任何
any
将返回True
当 至少有一个元素 是 Truthy 时。阅读 真值测试。全部
all
将返回True
仅当 所有元素 都为真时。真值表
注1: 空的iterable case在官方文档中有解释,像这样
any
由于没有一个元素为真,因此在这种情况下它返回
False
。all
由于没有任何元素为假,因此在这种情况下它返回
True
。笔记2:
关于
any
和all
的另一件重要的事情是,它会在他们知道结果的那一刻使执行短路。优点是,不需要消耗整个可迭代对象。例如,Here,
(not (i % 6) for i in range(1, 10))
is a generator expression which returnsTrue
if the current number within 1 and 9 is a multiple of 6.any
iterates themultiples_of_6
当它遇到6
时,它找到一个 Truthy 值,所以它立即返回True
,其余的multiples_of_6
不会被迭代。这就是我们在打印list(multiples_of_6)
时看到的结果,即7
、8
和9
的结果。这个优秀的东西在 这个答案 中被非常巧妙地使用了。
有了这个基本的了解,如果我们看一下你的代码,你就知道了
这确保了至少其中一个值是真实的,但不是全部。这就是为什么它返回
[False, False, False]
。如果您真的想检查两个数字是否不相同,