当前位置:   article > 正文

【Python】heapq—nlargest()和nsmallest()用法解析_heapq.nsmallest

heapq.nsmallest

【Python】heapq—nlargest()和nsmallest()用法解析

1. 介绍

1)这两个函数可以帮助我们在某个集合中找出最大或最小的N个元素。例如:

>>> import heapq
>>> nums=[1,8,2,23,7,-4,18,23,42,37,2]
>>> print(heapq.nlargest(3,nums))
[42, 37, 23]
>>> print(heapq.nsmallest(3,nums))
[-4, 1, 2]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2)如果正在寻找最大或者最小的N个元素,且同集合中元素的总数目相比,N很小,那么下面这些函数就可以提供更好的性能。这些函数首先会在底层将数据转化成列表,且元素会以堆得顺序排列。例如:

>>> nums=[1,8,2,23,7,-4,18,23,42,37,2]
>>> import heapq
>>> heap=list(nums)
>>> heapq.heapify(heap)#将列表原地转换成堆
>>> heap
[-4, 2, 1, 23, 7, 2, 18, 23, 42, 37, 8]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

3)堆最重要的特性就是,heap[0]总是最小的那个元素,此外,接下来的最小元素可以一次通过heapq.heappop()的方法轻松的找到。该方法会将第一个元素(最小的)弹出,然后以第二小的元素取而代之。例如,要找到第三小的元素,可以这样做:

>>> heapq.heappop(heap)
-4
>>> heapq.heappop(heap)
1
>>> heapq.heappop(heap)
2
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

4)使用key,来选取哪个位置做大小比较

predict = {idx: score for idx, score in enumerate(pred)}
pred_dict = heapq.nlargest(5, pred_dict.items(), key=lambda kv :kv[1])
  • 1
  • 2

2. 比较

  • 当要查找的元素个数相对比较小的时候,函数nlargest()和 nsmallest()是很合适的。

  • 如果你仅仅想查找唯一的最小或最大(N=1)的元素的话,那么使用 min()和max()函数会更快些。

  • 类似的,如果 N 的大小和集合大小接近的时候,通常先排序这个集合然后再使用切片操作会更快点
    (sorted(items)[:N] 或者是 sorted(items)[-N:])。

  • 需要在正确场合使用函数nlargest() 和nsmallest()才能发挥它们的优势(如果 N 快接近集合大小了,那么使用排序操作会更好些)。

  • 尽管你没有必要一定使用这里的方法,但是堆数据结构的实现是一个很有趣并且值得你深入学习的东西。 基本上只要是数据结构和算法书籍里面都会有提及到。 heapq 模块的官方文档里面也详细的介绍了堆数据结构底层的实现细节。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/161915
推荐阅读
相关标签
  

闽ICP备14008679号