¿Cómo encuentro la diferencia entre dos valores sin saber cuál es más grande?

Me preguntaba si había una función incorporada en Python que puede determinar la distancia entre dos números racionales, pero sin que yo le diga qué número es mayor. p.ej

>>>distance(6,3) 3 >>>distance(3,6) 3 

Obviamente, podría escribir una definición simple para calcular cuál es más grande y luego hacer una simple resta:

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

pero prefiero no tener que llamar a una función personalizada como esta. Por mi experiencia limitada, a menudo he encontrado que Python tiene una función incorporada o un módulo que hace exactamente lo que usted quiere y más rápido que su código. Esperemos que alguien pueda decirme que hay una función incorporada que puede hacer esto.

abs(xy) hará exactamente lo que estás buscando:

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

Si tiene curiosidad acerca de una respuesta diferente, las siguientes frases también funcionan:

  • max(x - y, y - x)

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

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

Usando abs(x - y) ciertamente es preferible.

Si tiene una matriz, también puede usar numpy.diff :

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

Sólo usa abs(x - y) . Esto devolverá la diferencia neta entre los dos como un valor positivo, independientemente de qué valor sea mayor.

Esto no aborda la pregunta original, pero pensé que ampliaría la respuesta que dieron zinturs. Si desea determinar la distancia debidamente firmada entre dos números cualquiera, puede usar una función personalizada como esta:

 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 

Por favor, comparta enfoques más simples o más pitones, si tiene uno.

Usa esta función.

Es la misma convención que querías. utilizando la función de abs simple de python.

también – a veces las respuestas son tan simples que las extrañamos, está bien 🙂

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

La función abs definitivamente no es lo que necesitas, ya que no está calculando la distancia. Intente abs (-25 + 15) para ver que no está funcionando. La distancia entre los números es 40, pero la salida será 10. Porque está haciendo los cálculos y luego eliminando “menos” al frente. Estoy usando esta función personalizada:

 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) ) 

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) )

distancia de impresión (-25, -15)
distancia de impresión (25, -15)
distancia de impresión (-25, 15)
distancia de impresión (25, 15)

Si planea usar el fragmento de cálculo de distancia firmado publicado por phi (como yo lo hice) y su b podría tener un valor de 0, probablemente desee corregir el código como se describe a continuación:

 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) 

El fragmento original no funciona correctamente con respecto al signo cuando a> 0 y b == 0.

Puedes probar: a = [0,1,2,3,4,5,6,7,8,9];

[abs (x [1] -x [0]) para x en zip (a [1:], a [: – 1])]