我经常需要从列表中选择一定数量的数字,以便它们与其他某个数字最接近。
例如:
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]]
答案 0 :(得分:2)
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
,但开销较小,因此对小型列表更有效。