【问题标题】:Finding the closest number equal to or greater than a given number找到等于或大于给定数字的最接近的数字
【发布时间】:2020-09-04 20:12:05
【问题描述】:

我有一个 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 子句,代码就会停止。

【问题讨论】:

  • 你需要找到n和每个值之间的最小差。
  • 一旦在列表中找到n,为什么还要继续寻找?

标签: python function


【解决方案1】:

条件i-n &lt; 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)

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

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

【讨论】:

  • @PranavHosangadi values[0] 不一定等于或大于 n。您可以在此处进行优化,迭代列表直到第一个可接受的项目,而不检查它是否是最接近的,然后从那里开始另一个循环检查元素是否更接近
  • 为什么不只是i &lt; closest?此外,如果每个值都小于n,则替代解决方案将中断。
  • @ekhumoro 好点 wrt i&lt;closest。陷入了我不应该拥有的 OP 的原始实现中。已编辑和改进,谢谢!
  • @Mureinik 解决替代解决方案的一种方法是:min((v for v in values if v &gt;= n] or [None])。不是很漂亮,但至少它提供了相同的输出。
猜你喜欢
  • 2016-04-17
  • 2012-12-27
  • 1970-01-01
  • 2014-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-05
相关资源
最近更新 更多