需求:
快速的获取一个列表中最大/最小的n个元素。

方法:
最简便的方法是使用heapq模组的两个方法nlargest()和nsmallest(),例如:

In [1]: import heapq
In [2]: nums = [1, 0, -23, 45, 34, -11, 0, 2, 99, 103, -78]
In [3]: print(heapq.nlargest(3, nums))
[103, 99, 45]
In [4]: print(heapq.nsmallest(3, nums))
[-78, -23, -11]
这两个方法还可以根据具体的key值来获取复杂数据结构的结果, 例如:

In [5]: computers = [
...: {'name' : 'IBM', 'shares' : 100, 'price' : 91.1},
...: {'name' : 'APPL', 'shares' : 59, 'price' : 543.22},
...: {'name' : 'FB', 'shares' : 200, 'price' : 21.09},
...: {'name' : 'HPQ', 'shares' : 35, 'price' : 31.75},
...: {'name' : 'YHOO', 'shares' : 45, 'price' : 16.35},
...: {'name' : 'ACME', 'shares' : 75, 'price' : 115.65}
...: ]
In [6]: cheap = heapq.nsmallest(4, computers, key=lambda s:s['price'])
In [7]: expensive = heapq.nlargest(4, computers, key=lambda s:s['price'])

In [8]: cheap
Out[8]:
[{'name': 'YHOO', 'price': 16.35, 'shares': 45},
{'name': 'FB', 'price': 21.09, 'shares': 200},
{'name': 'HPQ', 'price': 31.75, 'shares': 35},
{'name': 'IBM', 'price': 91.1, 'shares': 100}]

In [9]: expensive
Out[9]:
[{'name': 'APPL', 'price': 543.22, 'shares': 59},
{'name': 'ACME', 'price': 115.65, 'shares': 75},
{'name': 'IBM', 'price': 91.1, 'shares': 100},
{'name': 'HPQ', 'price': 31.75, 'shares': 35}]
扩展:
可以看出这两个方法对于找出n个最大/最小值的方便,从本质上看,其实调用模组heapq的左右就是返回一个排序堆构成的列表:

In [10]: nums = [1, 3, 5, -4, 18, -23, 0, 9, -6, 11]
In [11]: heap = list(nums)
In [12]: heapq.heapify(heap)
In [13]: heap
Out[13]: [-23, -6, 0, -4, 11, 5, 1, 9, 3, 18]

同样的,连续的元素也可以很方便的通过另一个方法heappop来获取:

In [14]: heapq.heappop(heap)
Out[14]: -23
In [15]: heapq.heappop(heap)
Out[15]: -6
In [16]: heapq.heappop(heap)
Out[16]: -4

当然,如果要选择最大/最小的1个元素(n=1,其实就是最大最小值),使用min(), max()自然更快。此外,对于获取n个元素,直接采用sorted(items)[:n]或者sorted(items)[-n:]也是方便快捷的。虽然替代方法不少,但是对于堆得使用确实很有意思的,有兴趣的读者可以继续研究它的底层实现。同样,对于heapq这个模组的使用可以参考heapq官方文档

最新文章

  1. 解决.NET WebService引用后添加HTTP Header的问题
  2. CentOS 6.5 安装 MySQL5.6 并用Navicat for MySQL 连接
  3. 最少clock
  4. [NOIP2015]运输计划 D2 T3 LCA+二分答案+差分数组
  5. R语言与正态性检验
  6. 256. Paint House
  7. CLI结果输出
  8. 房上的猫:switch选择结构,与选择结构总结
  9. VB6工程在Win10系统打开提示MSCOMCTL.OCX无法加载
  10. SQL Server服务没有自动启动原因案例分析
  11. 利用SUM打java补丁
  12. zookeeper的三种安装模式
  13. LeetCode刷题指南(字符串)
  14. Python3基础 str count 获得子字符串出现的次数
  15. 微信小程序接口开发中解决https外网调试问题
  16. ddt Ui 案例2
  17. JS window.onload 和模拟document.ready.
  18. #Leetcode# 817. Linked List Components
  19. 笔试题之java基础
  20. LeetCode: Median of Two Sorted Arrays 解题报告

热门文章

  1. 第1章 Java开发入门
  2. 【深入理解JVM】类加载器与双亲委派模型 (转)
  3. 一些通用的js工具类,添加自定义插件
  4. CentOS7 Python3安装redis
  5. http的导图
  6. TensorFlow入门——MNIST初探
  7. Hadoop网页监控配置
  8. linux上搭建单机版hadoop和spark
  9. centos8 网卡命令(centos7也可用)
  10. new和delete用法小结