2016-09-23 3 views
-2

Как написать функцию find_nearest_lower?Найдите следующее нижнее значение в списке чисел (float)?

>>> 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. Если это нежелательное поведение, вы могли бы вместо того, чтобы возвращать значение дозорный, например, None:

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, является приемлемым выбором дизайна. Независимо от того, если вы предпочитаете, чтобы он возвращал значение, сигнализация ничего не была найдена, вы могли бы сделать return max ([item для элемента в seq, если item Kevin

+1

Ох, на самом деле, выглядит как' ключевое слово default' отсутствует в 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.

Смежные вопросы