python - Python 的 any 和 all 函数是如何工作的?

我正在尝试了解 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 的实际用法。

最佳答案

您可以粗略地将 anyall 分别视为一系列逻辑 orand 运算符。

任何

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, return False

由于没有一个元素为真,在这种情况下它返回 False

all

Return True if all elements of the iterable are true (or if the iterable is empty).

由于没有一个元素是假的,在这种情况下它返回 True


注2:

关于 anyall 的另一件重要的事情是,当他们知道结果时,它会短路执行。优点是,不需要消耗整个可迭代对象。例如,

>>> 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值,所以立即返回Truemultiples_of_6 的其余部分未迭代。这就是我们打印 list(multiples_of_6) 时看到的,789 的结果。

这个好东西在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/

相关文章:

python - 使用 Python 的 os.path,我如何上一个目录?

linux - 如何就地对文件进行排序?

python - 如何在 Django 中的 CharField 上添加占位符?

linux - 我可以用/etc/hosts 映射一个主机名*和*一个端口吗?

python - `ValueError: cannot reindex from a duplic

linux - 有没有办法按列 'uniq'?

linux - 如何在linux中设置环境变量LD_LIBRARY_PATH

python - 从 pandas.DataFrame 中选择复杂的标准

linux - 如何在bash中创建仅包含十六进制字符而不包含空格的文件的十六进制转储?

python - 在 Python 中以编程方式生成视频或动画 GIF?