Python all()运算符的行为

时间:2013-12-08 02:44:48

标签: python

在Python中对all()运算符有疑问。 说

array = ["one","one","one"]
all( x=="one" for x in array )  <<--- i want to check for all "one" in array

以上似乎有效。但是,如果我有

array = []
all( x=="one" for x in array )  <<--- this still return true to me.

行为是我希望如果所有项目都不是“一”则返回false。怎么做?感谢

4 个答案:

答案 0 :(得分:1)

您可以阅读all(),如果它意味着:

  

如果任何项目评估为False,则返回False。否则True

所以一个空集将返回True,因为没有任何一个会使它成为假。

一般来说,在空集中,所有元素都满足您可以想象的任何要求。这是逻辑原理,而不是Python,BTW。

答案 1 :(得分:1)

all的实施等同于this

def all(iterable):
    for element in iterable:
        if not element:
            return False
    return True

因此,它返回True,直到iterable中的任何元素都是Falsy。在你的情况下,没有发生。这就是为什么它返回True

答案 2 :(得分:1)

  

怎么做?

array and all(x=="one" for x in array)

空列表为false,因此结果为false,all部分为真无关紧要。

如果你想处理像list这样的容器之外的迭代,那么它就更难了。我想你需要这样的东西:

set(x=="one" for x in iterable) == { True }

虽然如果你关心速度,整体上应该更快,因为上面的版本不会像all那样短路:

def nonempty_all(iterable):
    iterator = iter(iterable)
    try:
        if not next(iterator):
            return False
    except StopIteration:
        return False
    return all(iterator)

答案 3 :(得分:1)

all始终返回True以获取空列表/元组/等。这是因为从技术上讲,空集合中的每个项目都能满足任何条件。

要解决此问题,您需要添加一些其他代码来测试您的列表是否为空。幸运的是,空列表在Python中评估为False,因此您可以这样做:

>>> array = []
>>> bool(array and all(x=="one" for x in array))
False
>>> if array and all(x=="one" for x in array):
...     print True
... else:
...     print False
...
False
>>>