Ответ 1
abs(x-y)
сделает именно то, что вы ищете:
In [1]: abs(1-2)
Out[1]: 1
In [2]: abs(2-1)
Out[2]: 1
Мне было интересно, есть ли в 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 есть встроенная функция или модуль, который делает именно то, что вы хотите, и быстрее, чем ваш код. Надеюсь, кто-то может сказать мне, что есть встроенная функция, которая может сделать это.
abs(x-y)
сделает именно то, что вы ищете:
In [1]: abs(1-2)
Out[1]: 1
In [2]: abs(2-1)
Out[2]: 1
Если вам интересно узнать другой ответ, следующие однострочные работы также работают:
max(x - y, y - x)
max(x, y) - min(x, y)
functools.reduce(operator.sub, sorted([x, y], reverse=True))
Использование abs(x - y)
, безусловно, является предпочтительным.
Если у вас есть массив, вы также можете использовать numpy.diff
:
import numpy as np
a = [1,5,6,8]
np.diff(a)
Out: array([4, 1, 2])
Просто используйте abs(x - y)
. Это вернет чистую разницу между ними как положительное значение, независимо от того, какое значение больше.
Это не относится к исходному вопросу, но я думал, что буду расширять ответ, заданный 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
Пожалуйста, используйте более простые или более питонические подходы, если у вас есть.
используйте эту функцию.
это то же самое соглашение, которое вы хотели. используя простую функцию абзаца питона.
также - иногда ответы настолько просты, что мы их пропускаем, все в порядке:)
>>> def distance(x,y):
return abs(x-y)
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) )
print distance(-25, -15)
print distance(25, -15)
print distance(-25, 15)
print distance(25, 15)
Если вы планируете использовать подписанный фрагмент расчета расстояния, опубликованный 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.
Если вам не нужно целое число со знаком, это альтернатива, которая использует немного другой подход, легко читается и не требует импорта:
def distance(a, b):
if a > 0 and b > 0:
return max(a, b) - min(a, b)
elif a < 0 and b < 0:
return abs(a - b)
elif a == b:
return 0
return abs(a - 0) + abs(b - 0)
Вы можете попробовать: а = [0,1,2,3,4,5,6,7,8,9];
[abs (x [1] -x [0]) для x в zip (a [1:], a [: - 1])]