How do I find the difference between two values without knowing which is larger?
PythonFunctionNumbersDistancePython Problem Overview
I was wondering if there was a function built into Python that can determine the distance between two rational numbers but without me telling it which number is larger. e.g.
>>>distance(6,3)
3
>>>distance(3,6)
3
Obviously I could write a simple definition to calculate which is larger and then just do a simple subtraction:
def distance(x, y):
if x >= y:
result = x  y
else:
result = y  x
return result
but I'd rather not have to call a custom function like this. From my limited experience I've often found Python has a built in function or a module that does exactly what you want and quicker than your code does it. Hopefully someone can tell me there is a built in function that can do this.
Python Solutions
Solution 1  Python
abs(xy)
will do exactly what you're looking for:
In [1]: abs(12)
Out[1]: 1
In [2]: abs(21)
Out[2]: 1
Solution 2  Python
Although abs(x  y)
and equivalently abs(y  x)
work, the following oneliners also work:

math.dist((x,), (y,))
(available in 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)
, or equivalently(d := x  y) * math.copysign(1, d)
in Python ≥3.8 
functools.reduce(operator.sub, sorted([x, y], reverse=True))
All of these return the euclidean distance(x, y).
Solution 3  Python
Just use abs(x  y)
. This'll return the net difference between the two as a positive value, regardless of which value is larger.
Solution 4  Python
If you have an array, you can also use numpy.diff
:
import numpy as np
a = [1,5,6,8]
np.diff(a)
Out: array([4, 1, 2])
Solution 5  Python
This does not address the original question, but I thought I would expand on the answer zinturs gave. If you would like to determine the appropriatelysigned distance between any two numbers, you could use a custom function like this:
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
Please share simpler or more pythonic approaches, if you have one.
Solution 6  Python
So simple just use abs((a)  (b)).
will work seamless without any additional care in signs(positive , negative)
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
Solution 7  Python
use this function.
its the same convention you wanted. using the simple abs feature of python.
also  sometimes the answers are so simple we miss them, its okay :)
>>> def distance(x,y):
return abs(xy)
Solution 8  Python
If you plan to use the signed distance calculation snippet posted by phi (like I did) and your b might have value 0, you probably want to fix the code as described below:
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)
The original snippet does not work correctly regarding sign when a > 0 and b == 0.
Solution 9  Python
abs function is definitely not what you need as it is not calculating the distance. Try abs (25+15) to see that it's not working. A distance between the numbers is 40 but the output will be 10. Because it's doing the math and then removing "minus" in front. I am using this custom function:
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) )
print distance(25, 15)
print distance(25, 15)
print distance(25, 15)
print distance(25, 15)
Solution 10  Python
You can try: a=[0,1,2,3,4,5,6,7,8,9];
[abs(x[1]x[0]) for x in zip(a[1:],a[:1])]