给定 2 个 int 值,如果一个是负数,另一个是正数,则返回 True
Posted
技术标签:
【中文标题】给定 2 个 int 值,如果一个是负数,另一个是正数,则返回 True【英文标题】:Given 2 int values, return True if one is negative and other is positive 【发布时间】:2015-06-29 16:47:17 【问题描述】:def logical_xor(a, b): # for example, -1 and 1
print (a < 0) # evaluates to True
print (b < 0) # evaluates to False
print (a < 0 != b < 0) # EVALUATES TO FALSE! why??? it's True != False
return (a < 0 != b < 0) # returns False when it should return True
print ( logical_xor(-1, 1) ) # returns FALSE!
# now for clarification
print ( True != False) # PRINTS TRUE!
有人可以解释发生了什么吗?我正在尝试制作一个衬里:
lambda a, b: (a < 0 != b < 0)
【问题讨论】:
这里有一个教训:使用括号。或者,或者,使用print (a*b < 0)
。
return math.copysign(1, a) != math.copysign(1, b)
print ( True != False) # PRINTS TRUE!
你为什么这么惊讶?真不等于假是真。
@mikeTheLiar:OP 对此不感到惊讶;这是他最初期望的行为。
请不要通过破坏您的帖子为他人增加工作量。通过在 Stack Exchange (SE) 网络上发帖,您已根据 CC BY-SA license 授予 SE 分发内容的不可撤销权利(即无论您未来的选择如何)。根据 SE 政策,分发非破坏版本。因此,任何破坏行为都将被撤销。请参阅:How does deleting work? …。如果允许删除,则帖子下方左侧有一个“删除”按钮,但仅在浏览器中,而不是移动应用程序中。
【参考方案1】:
Python 中的所有比较运算符都有same precedence. 此外,Python 还进行链式比较。因此,
(a < 0 != b < 0)
分解为:
(a < 0) and (0 != b) and (b < 0)
如果其中任何一项为假,则表达式的总结果将为False
。
您要做的是分别评估每个条件,如下所示:
(a < 0) != (b < 0)
其他变体,来自 cmets:
(a < 0) is not (b < 0) # True and False are singletons so identity-comparison works
(a < 0) ^ (b < 0) # bitwise-xor does too, as long as both sides are boolean
(a ^ b < 0) # or you could directly bitwise-xor the integers;
# the sign bit will only be set if your condition holds
# this one fails when you mix ints and floats though
(a * b < 0) # perhaps most straightforward, just multiply them and check the sign
【讨论】:
请注意,(a < 0) ^ (b < 0)
也可以使用,并且它使用 xor 运算符。 :) 或者,(a < 0) is not (b < 0)
,因为 True
和 False
是单例,尽管有些人可能会反对这种语法:请参阅此处进行讨论:***.com/q/9494404/4014959
如果比较布尔值,^
for xor 确实有效,但不适用于 and
和 or
等所有值...
OP 专门标记了 Python 3.x,所以我链接到 Python 3 手册。
我个人喜欢 a * b
@supercat:不幸的是,python 没有 sign() 方法。有人为数学包提出了一个建议,但没有就边缘情况达成一致,因此没有集成(根据快速谷歌)。一种解决方法是使用 cmp(number, 0),它将返回 +1/0/-1。这确实适用于这个问题【参考方案2】:
您的代码无法按预期工作,因为 !=
占用的 precedence 高于 a < 0
和 b < 0
。正如 itzmeontv 在他的回答中所建议的那样,您可以通过用括号括起来的逻辑组件来简单地自己决定优先级:
(a < 0) != (b < 0)
您的代码尝试评估 a < (0 != b) < 0
[编辑]
正如 tzaman 正确指出的那样,运算符具有相同的优先级,但您的代码正在尝试评估 (a < 0) and (0 != b) and (b < 0)
。用括号括住你的逻辑组件将解决这个问题:
(a < 0) != (b < 0)
运算符优先级:https://docs.python.org/3/reference/expressions.html#operator-precedence
比较(即链接):https://docs.python.org/3/reference/expressions.html#not-in
【讨论】:
它们实际上是相同优先级;失败是因为它被视为链式比较。见docs。 @Xis88:是的,相当于(a < 0) and (0 != b) and (b < 0)
。
Op 专门标记了 Python 3,因此请链接到 Python 3 手册。【参考方案3】:
你可以用这个
return (a < 0) != (b < 0)
比较可以任意链接,例如,x
这样就变成了
(a < 0) and (0 != b) and (b < 0)
见https://docs.python.org/3/reference/expressions.html#not-in
【讨论】:
可能是!=
和<
优先级的一部分
<>
并非“被认为已过时”,它已从 Python 3.0 中完全删除。
(请注意 OP 用 [python-3.x] 标记了问题)【参考方案4】:
在 Python 中,比较运算符具有相同的优先级,并且它们是非关联的。比较运算符的序列有一个单独的规则,即链接规则。 Python documentation 对此表示:
如果
a, b, c, ..., y, z
是表达式而op1, op2, ..., opN
是比较运算符,则op1 b op2 c ... y opN z
等效于a op1 b and b op2 c and ... y opN z
,除了每个表达式最多计算一次。
此外,a op1 b and b op2 c and ... y opN z
从左到右求值。
a < 0 and 0 != b and b < 0
a < 0
将评估为False
,并且由于short-circuit evaluation 将停止进一步评估。因此,整个表达式将被评估为False
。
【讨论】:
这是错误的!您在那里引用的文档指出比较是链接的。 不与左结合。以上是关于给定 2 个 int 值,如果一个是负数,另一个是正数,则返回 True的主要内容,如果未能解决你的问题,请参考以下文章
2021-06-23:给定一个数组arr,代表每个人的能力值。再给定一个非负数k,如果两个人能力差值正好为k,那么可以凑在一起比赛。一局比赛只有两个人,返回最多可以同时有多少场比赛。