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