嵌套 "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)
我正在编写创建列表的代码,然后应用 "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)