python: Поиск в txt максимально близкого значения?

Рейтинг: -3Ответов: 1Опубликовано: 07.03.2023

Есть строка

gur = (6, 11, 2, 6, 6, 7, 10, 6)

Есть файл txt примерно такого вида:

(7, 2, 7, 3, 7, 4, 4, 6)
(5, 6, 1, 7, 3, 7, 1, 6)
(3, 3, 4, 5, 4, 4, 4, 4)
(5, 7, 3, 3, 5, 4, 6, 8)
(5, 2, 5, 6, 5, 5, 6, 8)
(6, 4, 7, 5, 4, 5, 5, 7)
(7, 6, 8, 8, 7, 5, 7, 7)
(5, 12, 11, 8, 6, 11, 8, 6)
(4, 13, 9, 5, 1, 6, 6, 5)
(13, 7, 6, 14, 10, 4, 5, 14)
(8, 6, 7, 8, 12, 4, 3, 7)
(8, 3, 9, 10, 3, 1, 6, 10)
(4, 11, 7, 8, 6, 8, 3, 5)

Как найти в этом файле наиболее близкое значение переменной gur - близкое именно по числам?

Ответы

▲ 4Принят

Ну вот вам заготовка с сортировкой от самых ближних по метрике значений, до самых дальних. Обычно в качестве метрики используется сумма квадратов разностей, но можно и сумму абсолютных разностей использовать и другие метрики:

gur = (6, 11, 2, 6, 6, 7, 10, 6)
data = (
(7, 2, 7, 3, 7, 4, 4, 6),
(5, 6, 1, 7, 3, 7, 1, 6),
(3, 3, 4, 5, 4, 4, 4, 4),
(5, 7, 3, 3, 5, 4, 6, 8),
(5, 2, 5, 6, 5, 5, 6, 8),
(6, 4, 7, 5, 4, 5, 5, 7),
(7, 6, 8, 8, 7, 5, 7, 7),
(5, 12, 11, 8, 6, 11, 8, 6),
(4, 13, 9, 5, 1, 6, 6, 5),
(13, 7, 6, 14, 10, 4, 5, 14),
(8, 6, 7, 8, 12, 4, 3, 7),
(8, 3, 9, 10, 3, 1, 6, 10),
(4, 11, 7, 8, 6, 8, 3, 5),
)

print(*sorted(data, key=lambda x: sum((a-b)**2 for a, b in zip(gur, x))), sep='\n')

Вывод (от самых ближних по метрике, до самых дальних):

(5, 7, 3, 3, 5, 4, 6, 8)
(7, 6, 8, 8, 7, 5, 7, 7)
(4, 11, 7, 8, 6, 8, 3, 5)
(4, 13, 9, 5, 1, 6, 6, 5)
(5, 12, 11, 8, 6, 11, 8, 6)
(6, 4, 7, 5, 4, 5, 5, 7)
(5, 2, 5, 6, 5, 5, 6, 8)
(5, 6, 1, 7, 3, 7, 1, 6)
(3, 3, 4, 5, 4, 4, 4, 4)
(8, 6, 7, 8, 12, 4, 3, 7)
(7, 2, 7, 3, 7, 4, 4, 6)
(8, 3, 9, 10, 3, 1, 6, 10)
(13, 7, 6, 14, 10, 4, 5, 14)

С метрикой abs(a-b) вывод будет уже немного другой:

(4, 11, 7, 8, 6, 8, 3, 5)
(5, 7, 3, 3, 5, 4, 6, 8)
(5, 12, 11, 8, 6, 11, 8, 6)
(5, 6, 1, 7, 3, 7, 1, 6)
(7, 6, 8, 8, 7, 5, 7, 7)
(5, 2, 5, 6, 5, 5, 6, 8)
(6, 4, 7, 5, 4, 5, 5, 7)
(4, 13, 9, 5, 1, 6, 6, 5)
(3, 3, 4, 5, 4, 4, 4, 4)
(7, 2, 7, 3, 7, 4, 4, 6)
(8, 6, 7, 8, 12, 4, 3, 7)
(8, 3, 9, 10, 3, 1, 6, 10)
(13, 7, 6, 14, 10, 4, 5, 14)

Одно значение можно получить, если использовать min вместо sorted:

print(min(data, key=lambda x: sum((a-b)**2 for a, b in zip(gur, x))))

Вывод:

(5, 7, 3, 3, 5, 4, 6, 8)