【问题标题】:in over multiple lists [duplicate]在多个列表中[重复]
【发布时间】:2020-02-18 17:46:05
【问题描述】:

我最近被这个弄糊涂了

if 2 in ([1,2] or [3,4]) : print(True)
else: print(False)
#prints True
  1. or 是一个布尔运算符,那么它如何应用于列表呢?
  2. 为什么它和if 2 in [1,2] or [3,4] 一样工作?

【问题讨论】:

  • 那个条件实际上应该是if any(2 in sub for sub in [[1,2], [3,4]]):
  • 回答您的其他问题:stackoverflow.com/questions/39983695/… 非空列表被认为是“真实的”,因此 [1,2] or [3,4] 的计算结果为 True

标签: python syntax operator-precedence


【解决方案1】:
  1. 使用any()
print(any(2 in x for x in [[1, 2], [3, 4]]))
  1. or 适用于任何类型,而不仅仅是布尔值。它返回最左边的真实操作数,如果没有任何操作数是真实的,则返回False。所以([1, 2] or [3, 4]) 等价于[1, 2],因为任何非空列表都是真实的。

通常,运算符不会像使用英语那样自动使用编程语言进行分发。 x in (a or b)x in a or x in b 不同。编程语言递归地计算表达式,所以x in (a or b) 大致相当于:

temp = a or b
x in temp

【讨论】:

    【解决方案2】:
    • 两种说法不同。
    • 在第一种情况下,python 将首先运行 2 in [1,4] 它的 False 所以现在它会检查 bool([1,3]) 和它的 True 所以它打印 1。
    • 但是对于第二种情况,首先([1,4] or [1,3]) 正在执行,这将返回第一个非空列表。因此它会返回 [1,4] 但 2 不在列表中,因此不会打印任何内容。
    • 一切都与执行顺序有关。
    • 再看两个例子。特别是最后一个例子。 ([1,4] or [2,4]) 将返回 [1,4] 并且 2 不在 [1,4] 中。现在它不会签入第二个列表[2,4]。如果那是你想要的,这不是正确的方法。使用any
    >>> if 2 in [1,4] or [1,3]: # True
    ...     print(1)
    ...
    1
    >>> if 2 in ([1,4] or [1,3]): # False
    ...     print(1)
    ...
    >>> if 2 in [1,4] or []: # False
    ...     print(1)
    ...
    >>> if 2 in ([1,4] or [2,4]): # False!!
    ...     print(1)
    ...
    

    【讨论】:

    • @lineage 更新
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-15
    • 2020-11-05
    • 2019-04-04
    • 2020-04-05
    • 1970-01-01
    • 2022-01-14
    相关资源
    最近更新 更多