【问题标题】:check if 2 given number are close to each other python检查2个给定数字是否彼此接近python
【发布时间】:2018-03-08 18:44:14
【问题描述】:

我被要求编写没有循环的代码并检查第一个数字是否接近第二个数字(接近意味着更大或更小一个)。我尝试使用巨大的条件,但我想也许有更简单的方法然后做这样的事情:

如果 num1 == num2 或 num1 == num2 - 1 或 num1 == num2 + 1

【问题讨论】:

  • abs(num1 - num2) <= 1
  • 如果您要多次执行此操作,请编写一个函数is_adjacent(num1, num2),然后调用该函数。然后,如果您使用一开始的冗长代码,它只会在一个地方冗长;如果您不确定自己是否理解 Johnny Mopp 编写的更智能的代码,它会被隔离到一个您可以单独测试的地方;如果你以后想改变它,只有一个地方可以改变它;等
  • 无循环限制似乎很奇怪。使用循环并不是一件小事。
  • @DeepSpace:有循环很简单,没有循环就更简单了。新手永远不会写any(num1==x for x in range(num2-1, num2+1)),但他们可能会想出它的扩展版本。 (也许没有循环的东西不应该是禁止那个答案的限制,而是一个让他们不要走那种想法的暗示?)

标签: python


【解决方案1】:

计算这两个数字的差,取其绝对值(如果num2大于num1)并将结果与​​1进行比较:

abs(num1 - num2) <= 1

这相对于 OP 的代码的优势

  1. 适用于浮点数。 Ex 1 和 1.4 将在原始代码中失败,但在此成功。

  2. 很容易改变“接近”的定义。例如,可以在 rhs 上使用 0.5 或 10000000。

【讨论】:

    【解决方案2】:

    我喜欢介绍 3 个函数,它们进行类似的近似但使用列表:

    def closest(lst, K):
        return lst[min(range(len(lst)), key=lambda i: abs(lst[i]-K))]
    

    为了理解上层函数,这个下一个函数类似:

    def closest(lst, K):
        minim = None
        for i in lst:
            aux = abs(i - K)
            if minim is None:
                minim = aux
                result = i
            if aux < minim:
                minim = aux
                result = i
        return result
    

    使用 numpy 库:

    import numpy
    def closest(lst, K):
        lst = numpy.asarray(lst)
        idx = (numpy.abs(lst - K)).argmin()
        return lst[idx]
    

    您可以使用如下示例调用上层函数:

    lst = [2.4, 3.2, 6.9, 7.2, 9.8]
    K = 5.1
    print(closest(lst, K))
    

    注意:如果数字刚好在中间,则函数取最小值。

    【讨论】:

      【解决方案3】:

      不认为这是一个解决方案,所以我正在添加它。

      将 Python 3.5 中引入的 math.isclose() 方法与 PEP 458 一起使用:

      #Function signature defined as
      math.isclose(a, b, *, rel_tol=1e-09, abs_tol=0.0)
      

      因此:

      math.isclose(a,b,rel_tol=1)
      

      虽然这对于 OP 的确切用例来说有点矫枉过正,但这是执行检查的最 Pythonic 方式。此外,根据文档,这可以处理 NaN+/- inf 值。

      NaN、inf 和 -inf 的 IEEE 754 特殊值将根据 IEEE 规则进行处理。具体来说,NaN 不被视为接近任何其他值,包括 NaN。 inf 和 -inf 仅被视为靠近它们自己。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-10-07
        • 2010-09-28
        • 1970-01-01
        • 2011-09-08
        • 2020-10-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多