还有什么更优雅的方法可以减少这种正/负逻辑?

时间:2018-10-08 21:25:13

标签: python python-3.x logic

是否有更优雅的方法来减少下面的代码,该代码应根据行的大小从左向右反转,反之亦然?

if right_length > left_length:
    direction = -1
elif right_length < left_length:
    direction = 1
else:
    direction = 0

5 个答案:

答案 0 :(得分:2)

如果使用math.copysign函数,则可以将3个分支语句减少为2:

import math
direction = 0 if left == right else math.copysign(1, left - right)

copysign将复制left - right的符号并将其应用于左操作数(在本例中为1)。

如果leftright为浮点型,请使用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)