Python的任何和所有功能如何工作?

时间:2013-10-15 19:31:15

标签: python

我正在尝试了解any()all() Python内置函数的工作原理。

我正在尝试比较元组,这样如果任何值不同,它将返回True,如果它们都相同,它将返回False。在这种情况下他们如何返回[False,False,False]?

ddefaultdict(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?

9 个答案:

答案 0 :(得分:308)

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

<强>任何

至少有一个元素是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:官方文档中解释了空的可迭代案例,如下所示

any

  

如果iterable的任何元素为true,则返回True如果iterable为空,请返回False

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

all

  

如果iterable的所有元素都为true(或者如果iterable为空),则返回True

由于没有元素是假的,因此在这种情况下返回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和9中的当前数字是6的倍数,则返回Trueany迭代multiples_of_6及其时遇到6,它会找到Truthy值,因此会立即返回True,而multiples_of_6的其余部分不会被迭代。这就是我们在打印list(multiples_of_6)时看到的结果,789的结果。

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的anyall函数如何工作?

anyall获取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返回Falseall返回True

>>> any([]), all([])
(False, True)

我今天在课堂上为学生演示了allany。他们大多对空迭代的返回值感到困惑。以这种方式解释会导致很多灯泡打开。

捷径行为

他们anyall都在寻找允许他们停止评估的条件。我给出的第一个例子要求他们评估整个列表中每个元素的布尔值。

(请注意,列表文字本身不是懒惰评估 - 您可以通过 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!

我认为如果您记住短切行为,您将直观地了解它们的工作方式,而无需引用真值表。

allany快捷方式的证据:

首先,创建一个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。它旨在解决比较多个位阵列的问题 - 即10的集合。

当你可以依赖值的“真实性” - 即它们在布尔上下文中的值时,

anyall是有用的。 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/