当我有以下python代码时,我在做一个leetcode问题:
pairs = [(1, 3)]
addend = 3
sum = 4
if ((addend, sum - addend) or (sum - addend, addend)) in pairs:
print("Pair exists")
我运行这段代码的预期输出应该是
Pair exists
但是,它不会打印任何内容,我认为这意味着((addend, sum - addend) or (sum - addend, addend))
的计算结果为False
。
然后我删除了外圆括号并将其制成
if (addend, sum - addend) or (sum - addend, addend) in pairs:
print("Pair exists")
这给了我正确的输出。
我的第二个猜测是这对多余的括号实际上计算出((addend, sum - addend) or (sum - addend, addend))
,所以我将((1, 3) or (3, 1))
直接放在Python3.7控制台中,这就是输出
>>> ((1, 3) or (3, 1))
(1, 3)
但这仍然没有意义,因为(1,3)实际上是成对的。
有人可以解释为什么加上这些括号会使语句无效吗?
答案 0 :(得分:1)
您应该使用any
:
if any(i in pairs for i in [(addend, sum-addend),(sum-addend,addend)]):
或使用:
if (addend, sum - addend) in pairs or (sum - addend, addend) in pairs:
您不能使用or
,因为or
只是选择了一个元素,而实际上并不是pairs
中的元素,因此请使用上面的代码。
答案 1 :(得分:1)
Python or
表达式的结果是第一个为真的操作数,如果没有,则为False
。
您尝试的第一个表达式是
((addend, sum - addend) or (sum - addend, addend)) in pairs
可以评估为
((3, 1) or (1, 3)) in pairs
由于括号中or
表达式的两个操作数都是非空元组,因此该表达式的计算结果为
(3, 1) in pairs
结果是错误的。
如果删除括号,则会遇到or
的优先级低于in
的事实。所以
(addend, sum - addend) or (sum - addend, addend) in pairs
与
相同(3, 1) or ((1, 3) in pairs)
同样,两个操作数都是真实的,因此无论(3, 1)
是否包含任何内容,表达式的求值为pairs
。
您可能想表达的是
(addend, sum - addend) in pairs or (sum - addend, addend) in pairs