繁体   English   中英

找到等于或大于给定数字的最接近的数字

[英]Finding the closest number equal to or greater than a given number

我有一个 python 函数,我需要在列表“值”中找到最接近给定数字“n”但大于或等于“n”的数字。

到目前为止,我有这个:

def nearest_largest_value2 (n, values):
      closest = []
      for i in values:
        if i == n:
          closest = i
        elif (i > n) and (i-n < 2):
          closest = i
       return closest

print(nearest_largest_value2(5, [1,3,4,6,7]))
print(nearest_largest_value2(5, [7,6,4,3,1]))
print(nearest_largest_value2(5, [1,3,4,5,6,7]))

问题是我得到了前两个打印语句(6)的答案,但是当我想得到 5 时,最后一个打印语句得到了“6”。

我是 Python 新手,但我认为一旦满足第一个if子句,代码就会停止。

in < 2中的条件是错误的。 相反,您应该检查当前i是否比当前closest 例如:

def nearest_largest_value2 (n, values):
  closest = None
  for i in values:
    if (i >= n) and (closest is None or i < closest):
      closest = i
  return closest

编辑:
描述问题的另一种方法是找到大于或等于n的最小值。 描述这样的问题允许一个更“pythonic”的单行:

def nearest_largest_value2 (n, values):
    return min(v for v in values if v >= n)

编辑2:
正如@ekhumoro 指出的那样,如果values不包含任何等于或大于n的元素,则先前编辑中提出的替代解决方案将中断。 他还慷慨地提出了解决办法:

def nearest_largest_value2 (n, values):
    min([v for v in values if v >= n] or [None])

如果您有多个不同数字的查询,但对同一个列表,那么首先对列表进行排序然后对其进行二进制搜索会更有效。

from bisect import bisect_left

values = [7, 6, 4, 3, 1]

values.sort()

def nearest_largest_value2 (n, values):
    try:
        result = values [bisect_left (values, n)]
    except IndexError: # when number is > every element of list 
        result = None
    return result

print (nearest_largest_value2 (5, values)) # 6
print (nearest_largest_value2 (3, values)) # 3
print (nearest_largest_value2 (8, values)) # None

p对应于length of 'values' list q对应于number of inputs 'n' (或 # 次最近的nearest_largest_value2被调用)。

所述情况下,先前解决方案的时间复杂度为O(pq)而当前解决方案的时间复杂度为O((p + q)logp)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM