嵌套"和/或"如果声明

时间:2017-07-27 13:42:19

标签: python list boolean-logic nested-if

我正在处理创建列表的代码,然后同时应用"或"和"和"进一步行动的条件:

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**应该等于真,但是它打印"不是真的"。这个错误的原因是什么?感谢

3 个答案:

答案 0 :(得分:7)

两种方法都不正确。请记住是一个短路操作符,因此它没有按照您的想法执行操作:

  

如果第一个参数为false,它只会计算第二个参数。

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

你想要的是:

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

如果要测试的项目较长,则可以避免使用or any来重复or,其中True也会在其中一项测试if any(x in a for x in case1) and any(x in a for x in case2): ... 时发生短路:

{{1}}

答案 1 :(得分:1)

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):
    ....

答案 2 :(得分:0)

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

("qjohn" or "carlos") in a相当于"qjohn" in a

"qjohn" or "cdarlos" in a相当于"qjohn" or ("cdarlos" in a)