【问题标题】:Behaviour of Python all() operator [duplicate]Python all() 运算符的行为 [重复]
【发布时间】:2013-12-25 07:14:30
【问题描述】:

对 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。怎么做?谢谢

【问题讨论】:

  • 列表中的所有 0 项都是 "one"。这是vacuous truth。您似乎认为列表中的所有项目并非都是"one";我建议阅读空洞的事实,这样您就不会不必要地使您的逻辑复杂化,将空列表排除在真正应该被接受的情况下。
  • 正如@user2357112 所指出的,这是一个简单的数学运算:对于array 的所有元素,您的命题都成立。

标签: python


【解决方案1】:

怎么做?

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

空列表为假,因此结果为假,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)

【讨论】:

  • 感谢您的解释
【解决方案2】:

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
>>>

【讨论】:

  • 感谢您的解释
【解决方案3】:

all的实现等价于this

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

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

【讨论】:

  • 嗨,谢谢。所以为了做我想做的事,我可以包含另一个语句: if array and all( x=="one" for x in array ) 。那是对的吗?我只是希望它不是空数组,并且所有元素都是“一个”。谢谢
  • @dorothy 没错 :)
  • 好的,谢谢你的解释
【解决方案4】:

您可以阅读all(),好像它的意思是:

如果任何项目的计算结果为False,则返回FalseTrue 否则。

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

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

【讨论】:

  • 感谢您的解释
猜你喜欢
  • 1970-01-01
  • 2018-10-06
  • 2019-01-15
  • 1970-01-01
  • 1970-01-01
  • 2013-10-16
  • 2017-03-20
  • 2010-12-28
  • 2018-03-30
相关资源
最近更新 更多