问题描述
我经常需要从列表中选择一定数量的数字,以便它们与其他某个数字最接近。
例如:
x0 = 45
n = 3
mylist = [12,32,432,43,54,234,23,543,2]
那么,如何从列表中选择与x0
最接近的n
数字?
有一些内置的方法吗?
topN = [43, 54, 32]
我看到的方式如下,但它看起来有点复杂:
diffs = sorted([(abs(x - x0), x) for x in mylist])
topN = [d[1] for d in diffs[:n]]
1楼
使用 :
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
元素。
2楼
也可以使用自定义函数排序来完成:
sorted(mylist, key = lambda x : abs(x-x0))[:n]
它在时间复杂度方面比heapq.nsmallest
慢,但是开销较少,因此对于小型列表更有效。