如何在不知道哪个值更大的情况下找到两个值之间的差异?

我想知道在 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 有一个内置的函数或模块,可以完成您想要的任务,并且比您的代码完成任务的速度更快。希望有人能告诉我,有一个内置的功能,可以做到这一点。

179252 次浏览

abs(x - y)。这将返回两者之间的净差值为正值,而不管哪个值更大。

abs(x-y)将完全符合您的要求:

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


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

使用这个函数。

和你想要的一样。 使用 python 的简单 abs 特性。

还有——有时候答案太简单了,我们会想念它们,没关系:)

>>> def distance(x,y):
return abs(x-y)

你可以试试: A = [0,1,2,3,4,5,6,7,8,9] ;

[ abs (x [1]-x [0]) for x in zip (a [1: ] ,a [ :-1])]

虽然 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 中相当于 (d := x - y) * math.copysign(1, d)≥3.8

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

所有这些返回欧几里德 距离(x,y)

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

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

Abs 函数绝对不是你需要的,因为它不计算距离。试试腹肌(-25 + 15) ,看看是否有效。数字之间的距离是40,但输出将是10。因为它在做数学运算,然后去掉前面的“负号”。我正在使用这个自定义函数:


Def 距离(a,b) :
如(a < 0)及(b < 0)或(a > 0)及(b > 0) :
返回 abs (abs (a)-abs (b))
如(a < 0)及(b > 0)或(a > 0)及(b < 0) :
返回 abs (abs (a) + abs (b))

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

这并没有回答最初的问题,但是我想我应该扩展一下 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

如果有的话,请分享一些更简单或者更简洁的方法。

如果您计划使用 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时,原始代码片段无法正常工作。

所以很简单,只要使用 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