嵌套 "and/or" if 语句

nested "and/or" if statements

我正在编写创建列表的代码,然后应用 "or" 和 "and" 条件来执行进一步的操作:

a= ["john", "carlos", "22", "70"]

if (("qjohn" or "carlos") in a) and (("272" or "70") in a):
    print "true"
else:
    print "not true"

输出:

not true

当我这样做时:

a= ["john", "carlos", "22", "70"]

if ("qjohn" or "cdarlos" in a) and ("272" or "d70" in a):
    print "true"
else:
    print "not true"

输出为"true"

我没有得到的是 **carlos and 70** 应该等于 true 但它正在打印 "not true"。这个错误的原因是什么?谢谢

两种方法都不正确。请记住 是一个短路运算符,因此它并没有像您认为的那样工作:

it only evaluates the second argument if the first one is false.

但是,非空字符串总是 True,因此第一种情况只检查第一个非空字符串的包含,而第二种情况从不执行包含 in 的检查因此,它总是 True.

你想要的是:

if ("qjohn" in a or "carlos" in a) and ("272"  in a or "70" in a):
   ...

如果要测试的项目较长,您可以通过使用 any 来避免重复 or,就像 or 一样,一旦其中一项测试 [=12] 也会短路=]:

if any(x in a for x in case1) and any(x in a for x in case2):
   ...
b = set(a)
if {"qjohn", "carlos"} & b and {"272", "70"} & b:
    ....

条件是 True 如果集的交集导致非空集(成员测试) - 在这方面测试非空集的真实性是相当 pythonic 的。


或者,使用 set.intersection:

if {"qjohn", "carlos"}.insersection(a) and {"272", "70"}.insersection(a):
    ....

两者都不正确。你理解的逻辑错误。

("qjohn" or "carlos") in a 等同于 "qjohn" in a

"qjohn" or "cdarlos" in a 等同于 "qjohn" or ("cdarlos" in a)