Comment puis-je trouver la différence entre deux valeurs sans savoir laquelle est la plus grande?

Je me demandais s'il y avait une fonction intégrée à Python qui peut déterminer la distance entre deux nombres rationnels mais sans que je lui dise quel nombre est le plus grand. par exemple

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

Évidemment, je pourrais écrire une définition simple pour calculer qui est plus grande et ensuite faire une simple soustraction:

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

Mais je préfère ne pas avoir à appeler une fonction personnalisée comme ça. De mon expérience limitée J'ai souvent trouvé Python a une fonction intégrée ou un module qui fait exactement ce que vous voulez et plus rapide que votre code le fait. J'espère que quelqu'un peut me dire qu'il y a une fonction intégrée qui peut le faire.

26
demandé sur Increasingly Idiotic 2012-11-28 13:47:48

9 réponses

abs(x-y) va faire exactement ce que vous cherchez:

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

In [2]: abs(2-1)
Out[2]: 1
60
répondu NPE 2012-11-28 09:49:13

Si vous êtes curieux d'une réponse différente, Les one-liners suivants fonctionnent également:

  • max(x - y, y - x)

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

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

Utiliser abs(x - y) est certainement préférable.

7
répondu A-B-B 2017-02-26 14:13:10

Utilisez simplement abs(x - y). Cela retournera la différence nette entre les deux en tant que valeur positive, quelle que soit la valeur la plus grande.

3
répondu Chris Heald 2012-11-28 09:49:13

Cela ne répond pas à la question initiale, mais je pensais développer la réponse donnée par zinturs. Si vous souhaitez déterminer la distance correctement signée entre deux nombres, vous pouvez utiliser une fonction personnalisée comme ceci:

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

Veuillez partager des approches plus simples ou plus pythoniques, si vous en avez une.

3
répondu phi 2017-11-19 16:17:33

Si vous avez un tableau, vous pouvez également utiliser numpy.diff:

import numpy as np
a = [1,5,6,8]
np.diff(a)
Out: array([4, 1, 2])
2
répondu G M 2017-02-26 14:15:53

Utilisez cette fonction.

C'est la même convention que vous vouliez. en utilisant la fonction abs simple de python.

Aussi-parfois les réponses sont si simples qu'elles nous manquent, c'est correct:)

>>> def distance(x,y):
    return abs(x-y)
1
répondu Inbar Rose 2012-11-28 09:49:29

Abs fonction est certainement pas ce que vous avez besoin comme il est pas calculer la distance. Essayez abs (-25 + 15) pour voir que cela ne fonctionne pas. Une distance entre les nombres est de 40 mais la sortie sera de 10. Parce que c'est faire le calcul et ensuite enlever "moins" devant. J'utilise cette fonction personnalisée:


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)

0
répondu zinturis 2016-11-15 14:42:59

Si vous prévoyez d'utiliser l'extrait de calcul de distance signé publié par phi (comme je l'ai fait) et que votre b peut avoir la valeur 0, Vous voudrez probablement corriger le code comme décrit ci-dessous:

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)

L'extrait d'origine ne fonctionne pas correctement en ce qui concerne le signe lorsque a > 0 et b = = 0.

0
répondu adp 2018-05-23 16:40:12

Vous pouvez essayer: a=[0,1,2,3,4,5,6,7,8,9];

[abs(x[1]-x[0]) pour x dans un fichier zip(a[1:],a[:-1])]

-5
répondu Yoram A 2014-04-08 19:35:33