是否有更优雅的方法来减少下面的代码,该代码应根据行的大小从左向右反转,反之亦然?
if right_length > left_length:
direction = -1
elif right_length < left_length:
direction = 1
else:
direction = 0
答案 0 :(得分:2)
如果使用math.copysign
函数,则可以将3个分支语句减少为2:
import math
direction = 0 if left == right else math.copysign(1, left - right)
copysign
将复制left - right
的符号并将其应用于左操作数(在本例中为1)。
如果left
和right
为浮点型,请使用math.isclose
检查是否存在浮动误差的紧密度。
direction = 0 if math.isclose(left, right) else math.copysign(1, left - right)
如果您有numpy,则可以使用np.sign
通过函数本身来处理left == right
的特例:
import numpy as np
direction = np.sign(left - right)
答案 1 :(得分:1)
也许像这样:
def direction(right_length, left_length):
diff = left_length - right_length
return int(abs(diff) / diff) if diff else 0
print(direction(5, 10)) # 1
print(direction(10, 5)) # -1
print(direction(1, 1)) # 0
答案 2 :(得分:1)
您可以将print与两个条件表达式一起使用
print(1 if r_len > l_len else -1 if l_len > r_len else 0)
答案 3 :(得分:1)
如果需要重用代码,则紧凑而优雅的函数定义可以是:
f = lambda x,y: 1 if x<y else -1 if x>y else 0
direction = f(right_length, left_length)
答案 4 :(得分:0)
您需要cmp
包中的math
(比较)功能。在其他语言中,类似的功能称为sign
。 Python社区在边缘案例上没有明确的共识,到目前为止,sign
不在语言之列。
direction = cmp(left_length, right_length)
我认为Python 3已弃用此方法。在这种情况下,请使用numpy.sign
对于没有 numpy
的Python 3,您可以
diff = left_length - right_length
print (math.copysign(1, diff) if diff else 0)