簡體   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