使用内置的heapd模块

  1. In [1]: import heapq
  2.  
  3. In [2]: nums = [1,8, 2, 23, 7, -4, 18, 23, 42, 37, 2]
  4.  
  5. In [3]: print(heapq.nlargest(2,nums))
  6. [42, 37]
  7.  
  8. In [4]: print(heapq.nlargest(5,nums))
  9. [42, 37, 23, 23, 18]
  10.  
  11. In [5]: print(heapq.nsmallest(5,nums))
  12. [-4, 1, 2, 2, 7]

两个函数都能接受一个关键字参数,用于更复杂的数据结构中

  1. In [6]: portfolio = [
  2. ...: {'name': 'IBM', 'shares': 100, 'price': 91.1},
  3. ...: {'name': 'AAPL', 'shares': 50, 'price': 543.22},
  4. ...: {'name': 'FB', 'shares': 200, 'price': 21.09},
  5. ...: {'name': 'HPQ', 'shares': 35, 'price': 31.75},
  6. ...: {'name': 'YHOO', 'shares': 45, 'price': 16.35},
  7. ...: {'name': 'ACME', 'shares': 75, 'price': 115.65}
  8. ...: ]
  9. In [11]: print(heapq.nsmallest(3,portfolio,key=lambda s: s['price']))
  10. [{'price': 16.35, 'name': 'YHOO', 'shares': 45}, {'price': 21.09, 'name': 'FB', 'shares': 200}, {'price': 31.75, 'name': 'HPQ', 'shares': 35}]
  11.  
  12. In [12]: print(heapq.nsmallest(2,portfolio,key=lambda s: s['price']))
  13. [{'price': 16.35, 'name': 'YHOO', 'shares': 45}, {'price': 21.09, 'name': 'FB', 'shares': 200}]

那么如果你想在集合中找到最小和最大的值

因为在底层实现里面,首先会先将集合数据进行堆排序后放入一个列表中

  1. In [1]: import heapq
  2.  
  3. In [2]: nums = [1, 8, 2, 23, 7, -4, 18, 23, 42, 37, 2
  4. ...: ]
  5.  
  6. In [3]: heap=list(nums)
  7.  
  8. In [4]: heap
  9. Out[4]: [1, 8, 2, 23, 7, -4, 18, 23, 42, 37, 2]
  10.  
  11. In [5]: heapq.heapify(heap)
  12.  
  13. In [6]: heap
  14. Out[6]: [-4, 2, 1, 23, 7, 2, 18, 23, 42, 37, 8]
  15.  
  16. In [7]: heap[0]
  17. Out[7]: -4
  18.  
  19. In [8]: heapq.heappop(heap)
  20. Out[8]: -4
  21.  
  22. In [9]: heapq.heappop(heap)
  23. Out[9]: 1
  24.  
  25. In [10]: heapq.heappop(heap)
  26. Out[10]: 2
  27.  
  28. In [11]: heapq.heappop(heap)
  29. Out[11]: 2
  30.  
  31. In [12]: heapq.heappop(heap)
  32. Out[12]: 7
  33.  
  34. In [13]: heap
  35. Out[13]: [8, 23, 18, 23, 42, 37]

堆数据结构最重要的特征是 heap[0] 永远是最小的元素。并且剩余的元素可以很容易的通过调用heapq.heappop() 方法得到, 该方法会先将第一个元素弹出来,然后用下一个最小的元素来取代被弹出元素(这种操作时间复杂度仅仅是 O(log N),N 是堆大小

  1. 当要查找的元素个数相对比较小的时候,函数 nlargest() nsmallest() 是很合适的。 如果你仅仅想查找唯一的最小或最大(N=1)的元素的话,那么使用 min() max() 函数会更快些。 类似的,如果 N 的大小和集合大小接近的时候,通常先排序这个集合然后再使用切片操作会更快点 sorted(items)[:N] 或者是 sorted(items)[-N:] )。 需要在正确场合使用函数 nlargest() nsmallest() 才能发挥它们的优势 (如果 N 快接近集合大小了,那么使用排序操作会更好些)。

查找最大或最小的 N 个元素的更多相关文章

  1. 使用deque模块固定队列长度,用headq模块来查找最大或最小的N个元素以及实现一个优先级排序的队列

    一. deque(双端队列) 1. 使用 deque(maxlen=N)会新建一个固定大小的队列.当新的元素加入并且这个队列已满的时候,最老的元素会自动被移除掉 >>> from c ...

  2. python3-开发进阶 heapq模块(如何查找最大或最小的N个元素)

    一.怎样从一个集合中获得最大或者最小的 N 个元素列表? heapq 模块有两个函数:nlargest() 和 nsmallest() 可以完美解决这个问题. import heapq nums = ...

  3. 【编程题目】查找最小的 k 个元素

    5.查找最小的 k 个元素(数组)题目:输入 n 个整数,输出其中最小的 k 个.例如输入 1,2,3,4,5,6,7 和 8 这 8 个数字,则最小的 4 个数字为 1,2,3 和 4. 算法里面学 ...

  4. 查找最小的k 个元素之C#算法实现

    紧接着上一篇微软编程面试100题,这次想解决的是查找最小的K个元素,题目是:输入n 个整数,输出其中最小的k 个.例如输入1,2,3,4,5,6,7 和8 这8 个数字,则最小的4 个数字为1,2,3 ...

  5. 查找最小的K个元素,使用最大堆。

    查找最小的K个元素,使用最大堆,具体代码如下: #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace st ...

  6. 【Data Structure & Algorithm】 查找最小的k个元素

    查找最小的k个元素 题目:输入n个整数,输出其中最小的k个. 例如输入1, 2, 3, 4, 5, 6, 7和8这八个数字,则最小的4个数字为1, 2, 3和4. 分析:这道题最简单的思路是把输入的n ...

  7. 从一个集合中查找最大最小的N个元素——Python heapq 堆数据结构

    Top N问题在搜索引擎.推荐系统领域应用很广, 如果用我们较为常见的语言,如C.C++.Java等,代码量至少也得五行,但是用Python的话,只用一个函数就能搞定,只需引入heapq(堆队列)这个 ...

  8. 排序,求几个最值问题,输入n个整数,输出其中最小的k个元素。

    看完两个求最大值算法之后的一些感想. 如果想直接看算法的可以跳过.但是我觉得我这些想法还是比较有用的,至少对我将来的算法设计是这样的. 算法的功能越强大,必然意味着速度慢,因为根据丛林法则,那种慢又功 ...

  9. python中使用heapq查看最大与最小的N个元素列表

    怎么从一个集合中获取最大或最小的N个元素列表? heapq模块有两个函数:nlargest() 和 nsmallest() 可以完美解决这个问题. In [39]: import heapq In [ ...

随机推荐

  1. VMware12虚拟机中Ubuntu16.04安装CPU版本Caffe

    首先,可以自行下载VMware12进行安装,基本上都是直接点击‘下一步’直到安装完成,这里重点讲一下Ubuntu16及Caffe的安装步骤 第一步: 下载Ubuntu16.04版本的文件,这里给出链接 ...

  2. maven配置文件setting.xml

    1.Maven本地仓库<localRepository>D:\DevTools\maven_Analytics\mavenrepo</localRepository> 2.网络 ...

  3. sqlserver 无法获得数据库独占权

    ALTER DATABASE trqxs_cs SET OFFLINE WITH ROLLBACK IMMEDIATE

  4. db_recovery_file_dest_size

    select name,space_limit,space_used,number_of_files from v$recovery_file_dest; alter system set db_re ...

  5. spring+activemq配置文件内容及实现原理

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  6. 001_vagrant利器

    一. 这是一个关于Vagrant的学习系列,包含如下文章: Vagrant入门 http://www.cnblogs.com/davenkin/p/vagrant-virtualbox.html 创建 ...

  7. 安装xcache3.0.3/3.2,为php加速

    安装xcache,为php加速 1.安装 # tar xf xcache-3.0.3.tar.bz2  # cd xcache-3.0.3 # /usr/local/php/bin/phpize # ...

  8. Ex 5_21 无向图G=(V,E)的反馈边集..._第九次作业

    根据题意,求的是最大生成树.利用Kruskal算法,对边进行从大到小的顺序进行排序,然后再依次取出边加入结果集中.假设图有n个顶点,那么,当结果集中有n-1条边时,剩下的边的集合即为反馈边集. pac ...

  9. Python-2d形变 动画 表格

    一.形变 /*1.形变参考点: 三轴交界点*/ transform-origin: x轴坐标 y轴坐标; /*2.旋转 rotate deg*/ transform: rotate(720deg); ...

  10. 深入浅出 JavaScript 关键词 -- this

    深入浅出 JavaScript 关键词 -- this 要说 JavaScript 这门语言最容易让人困惑的知识点,this 关键词肯定算一个.JavaScript 语言面世多年,一直在进化完善,现在 ...