需求:
快速的获取一个列表中最大/最小的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官方文档

Python实用黑科技——找出最大/最小的n个元素的更多相关文章

  1. Python实用黑科技——找出序列里面出现次数最多的元素

    需求: 如何从一个序列中快速获取出现次数最多的元素. 方法: 利用collections.Counter类可以解决这个问题,特别是他的most_common()方法更是处理此问题的最快途径.比如,现在 ...

  2. Python实用黑科技——解包元素(2)

    需求: 前面的文章讲的是使用变量的个数需要和迭代器数据变量的元素个数相同的方法,但更多的时候确实不想根据元素个数n来定义相应多的变量,而是希望用较少的变量( def drop_first_last(g ...

  3. Python实用黑科技——解包元素(1)

    需求: 很多时候手上已经有了一个具有n个元素的列表或者元组,你打算把这些元素单独取出来(解包)放入n个变量组成的集合(这里的集合和Python自己的set不同)中. 方法: 显然,最好的办法就是直接用 ...

  4. Python实用黑科技——以某个字段进行分组

    需求: 当前有个字典实例,你想以某个字段比如”日期”对整个字典里面的元素进行分组. 方法: itertools.groupby()函数是专门用来干这个活的.请看下面这个例子,这里有一个列表构成的字典, ...

  5. 阅读OReilly.Web.Scraping.with.Python.2015.6笔记---找出网页中所有的href

    阅读OReilly.Web.Scraping.with.Python.2015.6笔记---找出网页中所有的href 1.查找以<a>开头的所有文本,然后判断href是否在<a> ...

  6. LINQ找出重复和不重复的元素及linq OrderBy 方法 两个字段同时排序有关问题

    //重复元素:3,4,5 //不重复元素:1,8,9 , , , , , , , , , , }; //不重复元素 var unique = arr.GroupBy(i => i) .Where ...

  7. 找出数字数组中最大的元素(使用Math.max函数)

    从汤姆大叔的博客里看到了6个基础题目:本篇是第1题 - 找出数字数组中最大的元素(使用Match.max函数) 从要求上来看,不能将数组sort.不能遍历.只能使用Math.max,所以只能从java ...

  8. Class 找出一个整形数组中的元素的最大值

    目的:找出一个整形数组中的元素的最大值   以下,我们用类和对象的方法来做.   #include<iostream> using namespace std; class Array_m ...

  9. Python list去重及找出,统计重复项

    http://bbs.chinaunix.net/thread-1680208-1-1.html 如何找出 python list 中有重复的项 http://www.cnblogs.com/feis ...

随机推荐

  1. windows下命令行利器---Cmder(安装,中文乱码,配置右键菜单)

    很多人都是在win下开发的,这样就会出现,经常需要命令行操作,而win cmd命令和linux命令有很大差异,导致大家很难受,今天给大家介绍一个win下命令行的利器-Cmder 一.先看一下它的容颜 ...

  2. JAVA基础--JAVA API常见对象(字符串&缓冲区)

    一. String 类型 1. String类引入 第二天学习过Java中的常量:   常量的分类:   数值型常量:整数,小数(浮点数) 字符型常量:使用单引号引用的数据 字符串常量:使用双引号引用 ...

  3. IDEA2018.2.6激活(可用)

    破解插件下载: 链接:https://pan.baidu.com/s/1j2_kEm_Akcph6Qb8hr6soQ 提取码:hv64 将下载包放入bin文件夹下,修改bin中的两个文件 idea.e ...

  4. L2-014. 列车调度(Dilworth定理)

    火车站的列车调度铁轨的结构如下图所示. Figure 两端分别是一条入口(Entrance)轨道和一条出口(Exit)轨道,它们之间有N条平行的轨道.每趟列车从入口可以选择任意一条轨道进入,最后从出口 ...

  5. 虚拟机无法启动,提示:无法打开内核功能扩展“com.vmware.kext.vmci”: 无此文件或目录

    打开 系统偏好设置->安全性与隐私->允许打开 即可

  6. 部署Dashboard,监控应用

    部署web UI(dashboard)用于监控node资源 参见文档:https://blog.csdn.net/networken/article/details/85607593 官网:https ...

  7. plsql执行sql

    第一步找执行的命令:: plsql ::::::::::File----->>>>Change Windows to ------->>>Command Wi ...

  8. 001-CentOS 7系统搭建Rsyslog+LogAnalyzer解决交换机日志收

    日志功能对于操作系统是相当重要的,在使用中,无论是系统还是应用等等,出了任何问题,我们首先想到的便是分析日志,查找问题原因.自 CentOS 7 开始,我们的 CentOS 便开始使用 rsyslog ...

  9. PAT Basic 1012 数字分类 (20 分)

    给定一系列正整数,请按要求对数字进行分类,并输出以下 5 个数字: A​1​​ = 能被 5 整除的数字中所有偶数的和: A​2​​ = 将被 5 除后余 1 的数字按给出顺序进行交错求和,即计算 n ...

  10. python 教程(一)

    必须感慨一下,整了一周多的时间才基本理通顺.自己老是不能静心,方法也不对所以走了很多弯路. 1.建议:一定要先去看官方文档. 下面我们来看一周的成果吧: windows下如何下载并安装Python 3 ...