2016-09-23 36 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的,将被退回。