2016-09-23 33 views
-2

我應該如何編寫find_nearest_lower函數?在(浮點數)列表中查找下一個較低的值?

>>> values = [10.1, 10.11, 10.20] 
>>> my_value = 10.12 
>>> nearest_lower = find_nearest_lower(values, my_value) 
>>> nearest_lower 
10.11 

這需要在Python 2.6中工作,無需訪問numpy。

+2

是否總是排序值? – depperm

+0

是的,你可以使用muzido鏈接的代碼,只是跳過'abs'使它對「最接近的」或「最接近的」更敏感,而不是「最接近」。 – nostradamus

+0

@depperm是的,他們總是排序。 – fredrik

回答

5
>>> def find_nearest_lower(seq, x): 
...  return max(item for item in seq if item < x) 
... 
>>> values = [10.1, 10.11, 10.20] 
>>> my_value = 10.12 
>>> nearest_lower = find_nearest_lower(values, my_value) 
>>> nearest_lower 
10.11 

如果沒有在seq是比x小的任何值此方法將引發異常。如果這是令人不快的行爲,你可以改爲返回一個標記值,如無:

def find_nearest_lower(seq, x): 
    candidates = [item for item in seq if item < x] 
    if not candidates: return None 
    return max(candidates) 

或者

def find_nearest_lower(seq, x): 
    try: 
     return max(item for item in seq if item < x) 
    except ValueError: 
     return None 

...如果你比一個更大的「請求原諒」的人「看你跳躍」的人。

+0

我認爲這裏有一個參數,當列表中不包含任何低於x的值時引發異常是可接受的設計選擇。無論如何,如果你希望它返回一個沒有發現任何信號的值,你可以'返回最大值(如果項目 Kevin

+1

哦,實際上,看起來像'默認'關鍵字不存在於2.7或更低...我最好寫一個選擇。一會兒。 – Kevin

1

您可以使用itertools.dropwhile

>>> from itertools import dropwhile 
>>> values = [10.1, 10.11, 10.20] 
>>> my_value = 10.12 
>>> next(dropwhile(lambda x: x > my_value, sorted(values, reverse=True))) 
10.11 

您也可以通過一個default參數next()如果迭代器,而不是用完提高StopIteration的,將被退回。