Поскольку вам требуются кортежи ровно из 2 элементов, это можно сделать с помощью numpy
, чтобы найти пару точек, ближайших к x. Сделайте внешнее сложение списка с собой, найдите ближайшее абсолютное расстояние до x.
import numpy as np
def closest(lst, x):
arr = np.array(lst)
mat = np.abs(x - (arr[:, None] + arr)).astype(float)
mat[np.diag_indices_from(mat)] = np.NaN # Exclude tuples of same point with itself
i,j = np.unravel_index(np.nanargmin(mat), mat.shape)
return arr[i], arr[j]
closest([10,22,28,29,30,40], 54)
(22, 30)
closest([10,27,28,29,30,40], 54)
(27, 28)