如果按照元素远离枢轴的顺序对数组进行排序,那么您将能够获取前k个元素,这些元素最接近您正在查看的元素
def k_closest(sample, pivot, k):
return sorted(sample, key=lambda i: abs(i - pivot))[:k]
例:
>>> l = [1,2,3,4]
>>> k_closest(l, 3, 2)
[3,2]
>>> k_closest(l, 3, 3)
[3,2,4]
要获取元素的索引,您可以这样做:
def k_closest(sample, pivot, k):
return sorted(enumerate(sample), key=lambda (n, v): abs(v - pivot))[:k]
使用与以前相同的元素运行它,我们得到
>>> l = [1,2,3,4]
>>> k_closest(l, 3, 2)
[(2, 3), (1, 2)]
>>> k_closest(l, 3, 3)
[(2, 3), (1, 2), (3, 4)]
对于列表中的每个元组,第一个元素是原始数组中的索引,第二个元素是您实际感兴趣的数字
如果您只想要索引,可以稍微调整一下该函数
import operator
def k_closest(sample, pivot, k):
return map(operator.itemgetter(0), sorted(enumerate(sample), key=lambda (n, v): abs(v - pivot)))[:k]
运行原始输入,现在将给你
>>> k_closest(l, 3, 2)
[2, 1]
>>> k_closest(l, 3, 3)
[2, 1, 3]