【问题标题】:python any() works differently , why any([1,2]) in [1,3,5] returns True but not any(['a','b']) in ['a','v','x']? [closed]python any() 工作方式不同,为什么 [1,3,5] 中的 any([1,2]) 返回 True 但 ['a','v' 中的 any(['a','b']) 不返回, 'X']? [关闭]
【发布时间】:2020-02-05 15:26:21
【问题描述】:
any([1,2]) in [1,3,5]

输出是True 这是正确的,但是

any(['a','b']) in ['a','v','x']

False这是错的??
为什么在python中出现这种行为.??

【问题讨论】:

  • True in [1,3,5] >> 1 in [1,3,5]
  • 这根本不符合您的想法。第一个其实是在做True in [1, 3, 5]!
  • 你没有正确使用any()函数。
  • 也许你的意思是any(x in [1,3,5] for x in [1,2])
  • any([1,2]) in [1,3,5] 并不意味着“[1,3,5]?" 中是否存在任何值 [1,2] 您以错误的方式使用 any() 函数。

标签: python any


【解决方案1】:

它们实际上是两个操作:

首先评估“任何”,然后检查结果是否在另一个列表中:

any(list) --> is there any item in the list that is equivalent to True?

any([1, 2]) --> True, any non-zero integer is equivalent to True!
any(['a', 'b']) --> True, any character is equivalent to True!

然后

is the result (True) in [1, 3, 5]? --> Yes! 1 and True are actually the same!
is the result (True) in ['a','v','x']? --> No! True (or 1) is not in the list

你可以使用'set'解决你的问题:

set([1, 2]) & set([1, 3, 5]) --> set([1]) --> True, any non-empty set is equivalent to True!

set(['a','b']) & set(['a','v','x']) --> set(['a']) --> True, any non-empty set is equivalent to True!

与 cmets 一样,Python 在使用 'any' 时会隐式转换为 bool ('a' --> True),但在使用 'in' 时会进行完全匹配(1 就像 True 的内部表示)。

【讨论】:

    【解决方案2】:

    any(x) 返回True 当且仅当x 的任何元素计算为True

    所以,any([1,2]) in [1,3,5] 首先计算 any([1, 2]),即 True,因为 1 是“Truthy”,然后是 True in [1, 3, 5]

    True in [1, 3, 5]True,因为 in 测试项目与 in 之前的项目是否相等。因为,在 Python 中,True == 1True 确实在 [1, 2, 3]

    因此any([1,2]) in [1,3,5]True

    那么为什么是第二个False

    这是因为“真实”和等价之间的区别。

    any(['a', 'b']) 也是True。由于bool('a') == True,'a' 是'truthy'但是True != 'a',所以在第二部分就倒下了,因为'a'和'True'不等价,即True不在@ 987654346@。

    【讨论】:

    • 请注意,“[2] 中为真”为假
    • 确实,已编辑。
    【解决方案3】:

    任何正确的用法应该是:

    >>> any(x in ['a','v','x'] for x in ['a', 'b'])
    True
    >>> any(x in ['a','v','x'] for x in ['ea', 'b'])
    False
    

    你需要逐元素检查。

    【讨论】:

      【解决方案4】:

      你没有正确使用any()

      any() 接受一个iterable,如果iterable 中的任何一个值为真,则返回True,否则返回False。

      所以,在你的第一个例子中:

      any([1,2]) in [1,3,5]
      

      您在简单的可迭代[1,2] 上调用any(),并且任何非零数字都是真实的,因此any() 返回True

      True 恰好有一个整数值 1,所以你的语句等价于1 in [1,3,5],这是真的。

      你实际上想要这个:

      any(x in [1,3,5] for x in [1,2])
      

      【讨论】:

        【解决方案5】:

        这分两部分进行评估...

        any(['a','b'])Trueany([1,2]) 也是。所以你真的在问python“True 在下面的列表中吗?”

        你碰巧在第一个例子中很幸运1被python视为等同于True,所以就它而言,True 1, 2, 3

        尝试...any(1, 2, 3) in (3, 4) ...错误。因为1 不在第二个列表中。

        【讨论】:

        • 2 也是“真实的”。如bool(2) == True
        • True [双关语] 但这意味着左侧 any() 中的 anything 将评估为 True。 2 == True 是假的,这就是 in 正在做的事情
        猜你喜欢
        • 2017-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-21
        • 2020-04-13
        • 1970-01-01
        • 2022-07-05
        • 2014-07-06
        相关资源
        最近更新 更多