【问题标题】:Python all() function not indicating true when the list is identical当列表相同时,Python all() 函数不指示 true
【发布时间】:2020-08-23 12:14:00
【问题描述】:

我有一个浮点数列表,我想检查它们是否都为零。因此我试图用 all() 函数来实现它。

我尝试了一种在我的理论中应该有效但无效的方法:

test = [0, 0.4, 0, 0, 0.4, 0.4, 0.4, 0.21052631578947367, 0.4, 0.21052631578947367, 0.21052631578947367, 0.4, 0.21052631578947367]
all(test) == 0

>>> True

在上面的例子中,输出应该是False,但是我不知道为什么是True

下面的方法是有效的。

test = [0, 0.4, 0, 0, 0.4, 0.4, 0.4, 0.21052631578947367, 0.4, 0.21052631578947367, 0.21052631578947367, 0.4, 0.21052631578947367]
all(x==0 for x in test)

>>> False

谁能解释所有行为中的这种短路?

【问题讨论】:

    标签: python list boolean


    【解决方案1】:

    在上面的例子中(all(test)),输出应该是False,但是我不知道为什么是True

    因为all(test) 的计算结果为False,而tests as equal to 0

    all() 本身返回 True 如果输入的所有元素都是真实的。在您的情况下,0 不是,因此当all() 看到第 0 个元素并意识到它不需要在可迭代中继续进行时,将发生“短路”。

    表达您正在寻找的逻辑的另一种方式是:

    >>> not any(test)
    False
    >>> not any((0, 0, 0, 0))
    True
    

    但请记住,这将像对待零一样对待任何虚假值(例如None)。如果您专门查看 int 零,那么显式也没有什么坏处。

    >>> not any((None, False, 0, [], 0))
    True
    

    【讨论】:

      【解决方案2】:

      allany 函数分别检查 booleans 数组是否包含全部 True 或全部 False。 在 Python(和大多数语言)中,任何非空字符串的计算结果都为 True,因为任何不同于 0 的数字。
      在您的第一个示例中,列表中的 0 等于 False,因此 all(test) 等于 0。 在您的第二个示例中,您使用 list comprehension 语法生成一个布尔数组,当值等于 0 时为 True,否则为 False,这就是 all 导致 False 的原因(并非全部值为True,等于0)

      【讨论】:

        【解决方案3】:

        如果所有元素都为 True,则第一个版本返回 True。 0 为假。

        第二版和你想的不一样。

        输出

        print(x==0 for x in test)
        

        <generator object <genexpr> at 0x7fce4f84bc60> 
        

        因此,这不是您所需要的。

        你应该使用any()

        elements = test = [0, 0.4, 0, 0, 0.4, 0.4, 0.4, 0.21052631578947367, 0.4, 0.21052631578947367, 0.21052631578947367, 0.4, 0.21052631578947367]
        
        if not any(elements):
            print('All elements are false.')
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-06-30
          • 1970-01-01
          • 2016-06-08
          • 1970-01-01
          • 2013-10-15
          • 2020-06-18
          • 1970-01-01
          相关资源
          最近更新 更多