不知道哪个值较大,如何找到两个值之间的差异?

74
我在想Python中是否有一个函数可以确定两个有理数之间的距离,但不需要我告诉它哪个数字更大。 例如:
>>>distance(6,3)
3
>>>distance(3,6)
3

显然,我可以写一个简单的定义来计算哪个更大,然后进行简单的减法:

def distance(x, y):
    if x >= y:
        result = x - y
    else:
        result = y - x
    return result

但我宁愿不使用这样的自定义函数。从我的有限经验来看,Python通常有一个内置函数或模块可以完全满足您的需求,并且比您编写的代码更快速地完成。希望有人能告诉我是否存在一个内置函数可以完成此操作。

10个回答

141

abs(x-y)会完全做到你要的效果:

In [1]: abs(1-2)
Out[1]: 1

In [2]: abs(2-1)
Out[2]: 1

2
但是当您动态传递数字时,您将面临符号问题。下面分享了一个可行的解决方案。请检查。 - Siva S

30

虽然 abs(x - y) 以及等价的 abs(y - x) 可以实现,但以下单行代码也能达到同样效果:

  • math.dist((x,), (y,)) (Python ≥3.8中可用)

  • math.fabs(x - y)

  • max(x - y, y - x)

  • -min(x - y, y - x)

  • max(x, y) - min(x, y)

  • (x - y) * math.copysign(1, x - y),Python ≥3.8 中亦可使用等价的 (d := x - y) * math.copysign(1, d)

  • functools.reduce(operator.sub, sorted([x, y], reverse=True))

上述所有方法均返回欧几里得距离 distance(x, y)


2
解释为什么会选择一种解决方案而不是另一种可能是有用的。从局外人的角度来看,如果最短的解决方案 abs(x - y) 正确的话,我会想“谁在乎呢?” - michael_teter

9

只需使用 abs(x - y)。这将以正数返回两个数之间的净差异,无论哪个值较大。


8

如果您有一个数组,您也可以使用numpy.diff函数:

import numpy as np
a = [1,5,6,8]
np.diff(a)
Out: array([4, 1, 2])

4

如此简单,只需使用abs((a) - (b))。

将无缝地工作,无需额外关注符号(正数、负数)。

def get_distance(p1,p2):
     return abs((p1) - (p2))

get_distance(0,2)
2

get_distance(0,2)
2

get_distance(-2,0)
2

get_distance(2,-1)
3

get_distance(-2,-1)
1

2
请使用此函数。
这是您想要的相同约定。 使用 Python 的简单 abs 功能。
有时候答案非常简单,我们会错过它们,没关系 :)
>>> def distance(x,y):
    return abs(x-y)

1
这并没有回答原问题,不过我想扩展一下zinturs给出的答案。如果你想要确定任意两个数字之间适当符号的距离,你可以使用像这样的自定义函数:
import math

def distance(a, b):
    if (a == b):
        return 0
    elif (a < 0) and (b < 0) or (a > 0) and (b > 0):
        if (a < b):
            return (abs(abs(a) - abs(b)))
        else:
            return -(abs(abs(a) - abs(b)))
    else:
        return math.copysign((abs(a) + abs(b)),b)

print(distance(3,-5))  # -8

print(distance(-3,5))  #  8

print(distance(-3,-5)) #  2

print(distance(5,3))   # -2

print(distance(5,5))   #  0

print(distance(-5,3))  #  8

print(distance(5,-3))  # -8

如果您有更简单或更符合 Python 风格的方法,请分享。

2
使用以下代码测试通过:import math def distance(a, b): return (max(a, b) - min(a, b)) * (-1 if a > b else 1) - pansay
毫无疑问,Pansay提供的内容应该是这个问题的最佳答案了吧? - arranjdavis
两个数字之间的适当有符号距离(如果存在)为b-a。我认为这段代码过于复杂,而且它所解决的问题也没有明确定义。 - Johannes Overmann
这是一个荒谬和毫无意义的答案,因为abs(a - b)适用于所有情况下的距离。它甚至有时会返回无效的负距离。 - Asclepius

0
如果您计划使用phi发布的有符号距离计算片段(就像我一样),并且您的b可能具有值0,则可能需要按照以下描述修复代码:
import math

def distance(a, b):
    if (a == b):
        return 0
    elif (a < 0) and (b < 0) or (a > 0) and (b >= 0): # fix: b >= 0 to cover case b == 0
        if (a < b):
            return (abs(abs(a) - abs(b)))
        else:
            return -(abs(abs(a) - abs(b)))
    else:
        return math.copysign((abs(a) + abs(b)),b)

原始代码片段在 a > 0 且 b == 0 时无法正确工作。


-1

abs 函数绝对不是你所需要的,因为它不能计算距离。试试 abs(-25 + 15),你会发现它行不通。这两个数字之间的距离是40,但输出结果是10。因为它只是做了数学运算,然后去掉负号。我正在使用这个自定义函数:


def distance(a, b):
    if (a < 0) and (b < 0) or (a > 0) and (b > 0):
        return abs( abs(a) - abs(b) )
    if (a < 0) and (b > 0) or (a > 0) and (b < 0):
        return abs( abs(a) + abs(b) )

打印距离(-25,-15) 打印距离(25,-15) 打印距离(-25,15) 打印距离(25,15)


1
abs(-25 - 15) = abs(15 - -25) = 40。我不知道你为什么使用了 abs(-25 + 15) -- 在这种情况下,这是 abs 的错误用法。至于距离,def distance(a, b): return abs(a - b) - Asclepius
问题是关于距离的。例如,-25和-15之间的距离不是40,而是10。 - zinturis
1
那又怎样呢?在abs(a - b)中用-25和-15替换ab得到的结果是10,而不是40。总结一下,abs(a - b)用于计算距离。这一点在第一个答案中已经指出,但在你的回答中没有提到。 - Asclepius

-6
你可以尝试: a=[0,1,2,3,4,5,6,7,8,9]; [abs(x[1]-x[0]) for x in zip(a[1:],a[:-1])]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接