#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]