【问题标题】:Why is this expression always true when removing "any"?为什么删除“any”时这个表达式总是正确的?
【发布时间】:2021-10-09 02:34:35
【问题描述】:

我对“any”语法有一些问题。我有两个列表。

mainseq = ["hali", "hulu", "habi"]
seq = ["a", "b", "c", "d"]

我想查找seq 中的元素是否存在于mainseq 中。

for each in seq:
    if any(each in halum for halum in mainseq):
        print each

这给了我预期的“a”和“b”。但是当我删除“any”语法时,我得到了seq 中的所有值,即使mainseq 中没有“c”和“d”。

for each in seq:
    if (each in halum for halum in mainseq):
        print each

使用和没有“任何”功能的幕后发生了什么?

【问题讨论】:

    标签: python boolean-expression any


    【解决方案1】:

    要了解发生了什么,您可以通过打印等效的列表理解和boolean 表示和any 来调试它:

    for each in seq:
        print(each)
        print([each in halum for halum in mainseq])
        print(any(each in halum for halum in mainseq))
        print(bool(each in halum for halum in mainseq)) 
    
    # a
    # [True, False, True] <- contains more than one True element
    # True                <- so any returns True
    # True                <- boolean expression of a generator is always True
    
    # b
    # [False, False, True] <- contains one True element
    # True                 <- so any returns True
    # True                 <- boolean expression of a generator is always True
    
    # c
    # [False, False, False] <- no element is True
    # False                 <- so any returns False
    # True                  <- boolean expression of a generator is always True
    
    # d
    # [False, False, False] <- no element is True
    # False                 <- so any returns False
    # True                  <- boolean expression of a generator is always True
    

    但请记住,生成器的计算结果始终为True,因为生成器没有显式布尔表示,也没有长度(参见Truth-value-testing in the official documentation) .

    另一方面,

    any 消耗生成器并仅在 any 元素为 True 时返回 Trueeach == aeach == b 就是这种情况。所以if 条件不会总是被触发。

    【讨论】:

      【解决方案2】:

      (each in halum for halum in mainseq)generator expression。生成器表达式是truthy value。在if 语句中使用它将始终为True,因此该套件将始终被执行。 any() 在可迭代对象中搜索任何真实的值。因此,仅当该生成器表达式的任何结果为True 时,使用它才会执行套件。

      【讨论】:

      • 谢谢!所以,它是关于生成器表达式是一个真实的值。
      【解决方案3】:

      any 返回一个布尔值 TrueFalse

      您的语句 (each in halum for halum in mainseq) 返回一个生成器,该生成器评估为真值,因此代码始终位于 if 块中。 这是一个更详细的代码来解释这一点:

      http://ideone.com/AQ7dRs

      mainseq = ["hali", "hulu", "habi"]
      seq = ["a", "b", "c", "d"]
      
      print('Demo of any:\n')
      for each in seq:
          boolFlag = any(each in halum for halum in mainseq)
          print('Any returned:{0}'.format(boolFlag)) 
          if boolFlag:
              print each
      
      print('Demo of generator as truthy value:\n')
      
      for each in seq:
          boolFlag = (each in halum for halum in mainseq)
          print('boolFlag is:{0}'.format(boolFlag))
          if boolFlag:
              print each
              print('{0} is Truthy'.format(boolFlag))
      

      输出:

      Any returned:True
      a
      Any returned:True
      b
      Any returned:False
      Any returned:False
      Demo of generator as truthy value:
      
      boolFlag is:<generator object <genexpr> at 0xb7272bbc>
      a
      <generator object <genexpr> at 0xb7272bbc> is Truthy
      boolFlag is:<generator object <genexpr> at 0xb7272be4>
      b
      <generator object <genexpr> at 0xb7272be4> is Truthy
      boolFlag is:<generator object <genexpr> at 0xb7272bbc>
      c
      <generator object <genexpr> at 0xb7272bbc> is Truthy
      boolFlag is:<generator object <genexpr> at 0xb7272be4>
      d
      <generator object <genexpr> at 0xb7272be4> is Truthy
      

      【讨论】:

      • 您的示例令人困惑。首先,您通过list 使用生成器,然后尝试将其与anyif 一起使用...在list 转换后生成器为空。
      • @MSeifert 当然,我会编辑它,并发布一个更好的示例。
      • @DivineLight 请也接受正确答案。
      【解决方案4】:

      any() 如果可迭代的任何元素为真,则返回 True。如果 iterable 为空,则返回 False。

      所以if any(each in halum for halum in mainseq): 查看里面的元素。 每个为“a”或“b”的迭代包含这些元素,因此 if 语句为真。对于 "c" 和 "d" 的情况,iterable 为空,产生 false。

      当你删除 any() 时,你不再查看可迭代对象,而只是询问可迭代对象本身是否不正确。

      如果(mainseq 中的每个 halum 为 halum):

      总是正确的,因为它总是会产生一个有效的生成器对象。

      【讨论】:

      • 好的,我明白了,这里的 if 正在查看是否存在一个有效的生成器,它是“true”,因为“mainseq”是可迭代的。谢谢!
      【解决方案5】:

      Any 如果给定的列表中至少有 1 个元素,则返回 true。你可以通过这样做来实现你想要的:

      for each in seq:
          for halum in mainseq:
              if each in halum:
                  print each
      

      【讨论】:

        猜你喜欢
        • 2020-05-09
        • 2021-10-05
        • 1970-01-01
        • 1970-01-01
        • 2013-02-22
        • 1970-01-01
        • 2021-05-18
        • 2012-01-26
        相关资源
        最近更新 更多