如何在不知道哪个更大的情况下找到两个值之间的差异?

问题描述 投票:32回答:10

我想知道是否有一个内置于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有一个内置函数或一个模块,它可以完全按照您的需要执行,并且比代码更快。希望有人能告诉我有一个内置功能可以做到这一点。

python function numbers distance
10个回答
73
投票

abs(x-y)将完全满足您的需求:

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

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

-5
投票

您可以尝试:a = [0,1,2,3,4,5,6,7,8,9];

[abs(x [1] -x [0])for x in zip(a [1:],a [: - 1])]


9
投票

如果您对不同的答案感到好奇,以下单行也可以使用:

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

肯定使用abs(x - y)是首选。


4
投票

如果你有一个数组,你也可以使用numpy.diff

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

3
投票

只需使用abs(x - y)。这将返回两者之间的净差值作为正值,无论哪个值更大。


3
投票

这并没有解决原始问题,但我想我会扩展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

如果你有一个,请分享更简单或更多的pythonic方法。


1
投票

使用此功能。

它是你想要的相同的惯例。使用python的简单abs功能。

还 - 有时答案很简单我们想念它们,没关系:)

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

0
投票

绝对功能绝对不是你需要的,因为它不是计算距离。尝试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
投票

如果您打算使用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
投票

如果您不需要有符号整数,则可以使用稍微不同的方法,易于阅读且不需要导入:

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)
© www.soinside.com 2019 - 2024. All rights reserved.