[英]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.