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作为中间值创建自己的二叉树,并拆分左节点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))