我正在处理创建列表的代码,然后同时应用"或"和"和"进一步行动的条件:
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**
应该等于真,但是它打印"不是真的"。这个错误的原因是什么?感谢
答案 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)