来自python列表的前n个最接近的数字

时间:2014-03-10 05:06:32

标签: python

我经常需要从列表中选择一定数量的数字,以便它们与其他某个数字最接近。

例如:

x0 = 45
n = 3
mylist = [12,32,432,43,54,234,23,543,2]

那么,如何从列表中选择与n最接近的x0个数字?有一些内置的方法吗?

topN = [43, 54, 32]

我看到的方式如下,但看起来有点复杂:

diffs = sorted([(abs(x - x0), x) for x in mylist])
topN = [d[1] for d in diffs[:n]]

2 个答案:

答案 0 :(得分:2)

使用heapq.nsmallest

heapq.nsmallest(n, iterable[, key])
  

返回一个列表,其中包含iterable定义的数据集中的n个最小元素。 key(如果提供)指定一个参数的函数,该函数用于从iterable中的每个元素中提取比较键:key = str.lower等效于:sorted(iterable,key = key)[:n]

所以在你的特定情况下:

import heapq
x0 = 45
n = 3
mylist = [12,32,432,43,54,234,23,543,2]
heapq.nsmallest(n, mylist, key=lambda x: abs(x-x0))

这会减少开销,因为它会丢弃超过n的元素。

答案 1 :(得分:0)

可以使用自定义函数排序来完成:

sorted(mylist, key = lambda x : abs(x-x0))[:n]

在时间复杂度方面慢于heapq.nsmallest,但开销较小,因此对小型列表更有效。