Узнать ближайшее значение всех значений в списке

#python-3.x #list

#python-3.x #Список

Вопрос:

Для этого списка:

 list = [1,5,7,11,23,8,45,18]
 

Как я могу вычислить ближайшее значение для каждого значения в списке?
В этом случае вывод будет выглядеть:

 'value' 1 : 5 
'value' 5 : 7
'value' 7 : 8
'value' 11 : 8
'value' 23 : 18
'value' 8 : 7
'value' 45 : 23
'value' 18 : 23
 

Ответ №1:

это способ сделать это:

 lst =  [1, 5, 7, 11, 23, 8, 45, 18]

srt = sorted(lst)
nearest_dct = {srt[0]: srt[1], srt[-1]: srt[-2]}
for low, n, high in zip(srt[:-2], srt[1:-1], srt[2:]):
    nearest_dct[n] = low if n - low < high - n else high
# nearest_dct = {1: 5, 45: 23, 5: 7, 7: 8, 8: 7, 11: 8, 18: 23, 23: 18}
res = [nearest_dct[n] for n in lst]
# [5, 7, 8, 8, 18, 7, 23, 23]
 

этот способ выполняет итерацию только один раз по списку (хорошо, сначала нужно отсортировать список …). улучшением было бы использовать islice вместо обычных срезов. вот более прямая версия:

 from itertools import islice

srt = [-float('inf'), *sorted(lst), float('inf')]
nearest_dct = {n: low if n - low < high - n else high for low, n, high in
               zip(srt, islice(srt, 1, None, None), islice(srt, 2, None, None))}
res = [nearest_dct[n] for n in lst]
# [5, 7, 8, 8, 18, 7, 23, 23]