web-dev-qa-db-ja.com

どちらが大きいかわからずに2つの値の違いを見つけるにはどうすればよいですか?

Pythonに組み込まれた関数が2つの有理数の間の距離を決定できますが、どちらの数が大きいかを教えてくれませんか。

>>>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が組み込み関数またはあなたが望むものを正確に実行し、あなたのコードが行うよりも速いモジュールを持っています。これを行うことができる機能で。

33
Rapid

abs(x-y)は、まさにあなたが探していることをします:

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

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

別の答えに興味がある場合は、次のワンライナーも使用できます。

  • max(x - y, y - x)

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

  • _(x - y) * math.copysign(1, x - y)_

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

abs(x - y)または同等のabs(y - x)の使用が確実に推奨されます。

10
Acumenus

配列がある場合は、 numpy.diff

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

これは元の質問には対応していませんが、私はzintursが出した答えを拡張すると思いました。任意の2つの数値間の適切に署名された距離を決定する場合は、次のようなカスタム関数を使用できます。

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

もしあれば、より単純なまたはより多くのPythonicアプローチを共有してください。

3
phi

abs(x - y)を使用してください。これは、どちらの値が大きいかに関係なく、2つの正味の差を正の値として返します。

3
Chris Heald

この機能を使用します。

それはあなたが望んだのと同じ慣習です。 Pythonの単純なabs機能を使用します。

また-時々答えはとても簡単です、私たちはそれらを逃します、大丈夫:)

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

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の場合、符号に関して正しく機能しません。

0
adp

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

符号付き整数が必要ない場合、これはわずかに異なるアプローチを使用し、読みやすく、インポートを必要としない代替手段です。

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
Chrispy