python列表中最接近的n个数字

python列表中最接近的n个数字,python,Python,我经常需要从列表中选择一定数量的数字,以便它们与其他特定数字最接近 例如: x0 = 45 n = 3 mylist = [12,32,432,43,54,234,23,543,2] 那么,如何从列表中选择与x0最接近的编号?有什么内置的方法吗 topN = [43, 54, 32] 我的看法如下,但看起来有点复杂: diffs = sorted([(abs(x - x0), x) for x in mylist]) topN = [d[1] for d in diffs[:n]] 也可

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

例如:

x0 = 45
n = 3
mylist = [12,32,432,43,54,234,23,543,2]
那么,如何从列表中选择与
x0
最接近的编号?有什么内置的方法吗

topN = [43, 54, 32]

我的看法如下,但看起来有点复杂:

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

也可以使用“按自定义排序”功能完成:

sorted(mylist, key = lambda x : abs(x-x0))[:n]
就时间复杂度而言,它比heapq.nsmallest慢,但开销较小,因此对于小列表更有效。

使用:

从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

时,它会丢弃元素。这比简单排序好吗?它是否以某种方式利用了我不需要对整个列表进行排序的事实?是的,它更好。它将值推送到
中,直到
n
大小,因此只有一个循环,没有列表的完整副本,并且可以快速丢弃坏值。或者,您可以使用x0作为中间值创建自己的二叉树,并拆分左节点x0。但是heapq已经在使用某种二叉树了。可能有一些初始的开销对于9个元素来说太重了。它对成千上万的人最有效elements@sashkello使用heap意味着时间复杂度为O(k logn),其中k是堆的大小(而不是排序的O(n logn),因此可以节省一些时间。请注意,这是算法复杂性-当k接近n时,
sorted
通常会更快,因为timsort非常好。请看这里的一些讨论。当我发布问题时,我已经知道一个可能的答案,我觉得应该在答案中而不是问题中。然而,我想看看还有什么其他的答案。这毕竟是一个问答网站,答案应该是“答案”的一部分:)@sjcipher还有,我不喜欢这样的问题:“我已经做到了,我该如何改进?”——因为答案很可能是“不可能”。当我把它作为一个答案,如果是这样的话,我可以在事后接受它,保持适当的问答结构。我同意这一点,这是真的。
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))