我正在尝试了解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?
答案 0 :(得分:308)
您可以将any
和all
分别视为一系列逻辑or
和and
运算符。
<强>任何强>
当至少有一个元素是Truthy时, any
将返回True
。阅读Truth Value Testing.
所有强>
仅当所有元素都是Truthy时, 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的任何元素为true,则返回
True
。 如果iterable为空,请返回False
由于没有一个元素为真,因此在这种情况下返回False
。
如果iterable的所有元素都为true(或者如果iterable为空),则返回
True
。
由于没有元素是假的,因此在这种情况下返回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和9中的当前数字是6的倍数,则返回True
。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)
确保至少其中一个值是Truthy而不是全部。这就是它返回[False, False, False]
的原因。如果你真的想检查两个数字是否相同,
print [x[0] != x[1] for x in zip(*d['Drd2'])]
答案 1 :(得分:33)
Python的
any
和all
函数如何工作?
any
和all
获取iterables并返回True
,如果元素的任何和所有(分别)都是True
。
>>> any([0, 0.0, False, (), '0']), all([1, 0.0001, True, (False,)])
(True, True) # ^^^-- truthy non-empty string
>>> any([0, 0.0, False, (), '']), all([1, 0.0001, True, (False,), {}])
(False, False) # ^^-- falsey
如果可迭代为空,any
返回False
,all
返回True
。
>>> any([]), all([])
(False, True)
我今天在课堂上为学生演示了all
和any
。他们大多对空迭代的返回值感到困惑。以这种方式解释会导致很多灯泡打开。
他们any
和all
都在寻找允许他们停止评估的条件。我给出的第一个例子要求他们评估整个列表中每个元素的布尔值。
(请注意,列表文字本身不是懒惰评估 - 您可以通过 Iterator 获得 - 但这仅用于说明目的。)
这是任何和所有的Python实现:
def any(iterable):
for i in iterable:
if i:
return True
return False # for an empty iterable, any returns False!
def all(iterable):
for i in iterable:
if not i:
return False
return True # for an empty iterable, all returns True!
当然,真正的实现是用C语言编写的,并且性能更高,但是您可以替换上面的内容并在此(或任何其他)答案中获得相同的结果。
all
all
检查元素为False
(因此它可以返回False
),如果它们都不是True
,则会返回False
。< / p>
>>> all([1, 2, 3, 4]) # has to test to the end!
True
>>> all([0, 1, 2, 3, 4]) # 0 is False in a boolean context!
False # ^--stops here!
>>> all([])
True # gets to end, so True!
any
any
的工作方式是检查元素为True
(因此它可以返回True), then it returns
False if none of them were
True`。
>>> any([0, 0.0, '', (), [], {}]) # has to test to the end!
False
>>> any([1, 0, 0.0, '', (), [], {}]) # 1 is True in a boolean context!
True # ^--stops here!
>>> any([])
False # gets to end, so False!
我认为如果您记住短切行为,您将直观地了解它们的工作方式,而无需引用真值表。
all
和any
快捷方式的证据:首先,创建一个noisy_iterator:
def noisy_iterator(iterable):
for i in iterable:
print('yielding ' + repr(i))
yield i
现在让我们使用我们的示例喧闹地遍历列表:
>>> all(noisy_iterator([1, 2, 3, 4]))
yielding 1
yielding 2
yielding 3
yielding 4
True
>>> all(noisy_iterator([0, 1, 2, 3, 4]))
yielding 0
False
我们可以在第一个False布尔检查中看到all
停止。
并且any
在第一个True布尔检查上停止:
>>> any(noisy_iterator([0, 0.0, '', (), [], {}]))
yielding 0
yielding 0.0
yielding ''
yielding ()
yielding []
yielding {}
False
>>> any(noisy_iterator([1, 0, 0.0, '', (), [], {}]))
yielding 1
True
答案 2 :(得分:10)
我知道这是旧的,但我认为在代码中显示这些函数的外观可能会有所帮助。这真的说明了逻辑,比文本或表IMO更好。实际上它们是用C而不是纯Python实现的,但这些都是等价的。
def any(iterable):
for item in iterable:
if item:
return True
return False
def all(iterable):
for item in iterable:
if not item:
return False
return True
特别是,您可以看到空迭代的结果只是自然结果,而不是特殊情况。您还可以看到短路行为;实际上,不是短路的。
当Guido van Rossum(Python的创建者)first proposed adding any()
and all()
时,他只是简单地发布了上面的代码片段来解释它们。
答案 3 :(得分:9)
您提出的问题代码来自我给出的答案here。它旨在解决比较多个位阵列的问题 - 即1
和0
的集合。
any
和all
是有用的。 1是True
,0是False
,这是答案所利用的便利。 5恰好也是True
,所以当你把它混合到你可能的输入中时......好吧。不起作用。
你可以这样做:
[len(set(x)) == 1 for x in zip(*d['Drd2'])]
它缺乏前一个答案的美学(我真的喜欢any(x) and not all(x)
的外观),但它完成了工作。
答案 4 :(得分:8)
>>> any([False, False, False])
False
>>> any([False, True, False])
True
>>> all([False, True, True])
False
>>> all([True, True, True])
True
答案 5 :(得分:4)
...
答案 6 :(得分:1)
概念很简单:
undefined
答案 7 :(得分:0)
list = [1,1,1,0]
print(any(list)) # will return True because there is 1 or True exists
print(all(list)) # will return False because there is a 0 or False exists
return all(a % i for i in range(3, int(a ** 0.5) + 1)) # when number is divisible it will return False else return True but the whole statement is False .
答案 8 :(得分:0)
all() 函数用于检查集合的每个成员是否为真。例如,all() 函数可用于更简洁地条件化以下形式的语句:
if all entre's are vegan this is a vegan restaurant
在代码中:
all(x is vegan for x in menu)
如果菜单(迭代器)上的每一项(x)对于条件(is vegan;x == vegan)的计算结果都为 True,则 all 语句的计算结果为 True。
此处有更多示例:https://www.overcoded.net/python-all-function-223809/