web-dev-qa-db-fra.com

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

Je me demandais s'il existait 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 plus grand . P. Ex.

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

Évidemment, je pourrais écrire une définition simple pour calculer laquelle est la plus grande, puis faire une simple soustraction:

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

mais je préférerais ne pas avoir à appeler une fonction personnalisée telle que celle-ci ... De mon expérience limitée, j'ai souvent constaté que Python est doté d'une fonction intégrée ou d'un module qui fait exactement ce que vous voulez et plus rapidement que votre code. J'espère que quelqu'un pourra me dire qu'il existe une fonction intégrée qui peut le faire.

29
Rapid

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

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

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

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

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

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 celle-ci:

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

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

3
phi

Utilisez simplement abs(x - y). La différence nette entre les deux sera renvoyée sous forme de valeur positive, quelle que soit la valeur la plus grande.

3
Chris Heald

utiliser cette fonction.

c’est la même convention que vous vouliez ... utiliser la simple fonctionnalité abs de python.

aussi - parfois les réponses sont si simples qu'elles nous manquent, ça va :)

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

Si vous envisagez d'utiliser l'extrait de calcul de la distance signée publié par phi (comme je l'ai fait) et que votre b peut avoir la valeur 0, vous souhaiterez 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 de code d'origine ne fonctionne pas correctement en ce qui concerne le signe lorsque a> 0 et b == 0.

0
adp

la fonction abs n'est certainement pas ce dont vous avez besoin, car elle ne calcule pas la distance. Essayez abs (-25 + 15) pour voir que ça ne marche pas. Une distance entre les nombres est de 40 mais la sortie sera de 10. Parce que cela fait le calcul, puis enlève le "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
zinturis