Python实用黑科技——找出最大/最小的n个元素

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

原文地址:https://www.cnblogs.com/valorchang/p/11289115.html

时间: 2024-08-28 08:10:19

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

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

http://bbs.chinaunix.net/thread-1680208-1-1.html 如何找出 python list 中有重复的项 http://www.cnblogs.com/feisky/archive/2012/12/06/2805251.html 比较容易记忆的是用内置的setl1 = ['b','c','d','b','c','a','a']l2 = list(set(l1))print l2 还有一种据说速度更快的,没测试过两者的速度差别l1 = ['b','c','d

水贴王之续,找出数组里出现频率最高的元素

找出数组里出现频率最高的元素 个人信息:就读于燕大本科软件工程专业 目前大三; 本人博客:google搜索"cqs_2012"即可; 个人爱好:酷爱数据结构和算法,希望将来从事算法工作为人民作出自己的贡献; 博客内容:水贴王问题之续 博客时间:2014-5-12; 编程语言:Java ; 编程坏境:Windows 7 专业版 x64; 编程工具:jdk,eclipse x64; 制图工具:office 2007 powerpoint; 硬件信息:7G-3 笔记本; 真言: 痛苦的活着比

找出两个数组的相同元素,最优算法?

在做新旧接口交替过程中,遇到了老接口和新接口json数据有些不一致的情况,需要比较两个json对象,把相同的元素赋其中一个json对象中变量的值.而且其中一个json最后输出格式还需要改变下属性名,思来想去觉得和"找出两个数组相同元素"很像,所以做下总结. "有一个数组A{0,2,3,5}和一个数组B{3,5,6,2,1,1},找出这两个数组相同元素." 一开始抽象出这道题时,脑海里浮现出最简单粗暴的方法,逐一比较. //最简单粗暴的做法,逐个比较,时间复杂度为(B

找出数组中唯一的重复元素

[问题] 1-1000放在含有1001个元素的数组中,只有唯一的一个元素值重复,其它均只出现一次. 每个数组元素只能访问一次,设计一个算法,将它找出来:不用辅助存储空间,能否设计一个算法实现? [代码] #include <stdio.h> #include <stdlib.h> #include <string.h> /*根据异或法的计算方式,每两个相异的数执行异或运算之后,结果为1: 每两个相同的数异或之后,结果为0,任何数与0异或,结果仍为自身. 所以数组a[N]

找出两个数组相同的元素,并且对应的个数一样

/** * 找出两个数组相同的元素,并且对应的个数一样 * @param args */ public static void getSameNumberCount(String[] a, String[] b) { Map<String, Integer> map = new HashMap<String, Integer>(); for (int i = 0; i < a.length; i++) { if (!map.containsKey(a[i])) { map.p

Python基础-生物信息:找出基因,生物学家使用字母A、C、T和G构成的字符串建模一个基因组。

生物信息:找出基因,生物学家使用字母A.C.T和G构成的字符串建模一个基因组.一个基因是基因组的子串,它从三元组ATG后开始在三元组TAG.TAA或TGA之前结束.此外,基因字符串的长度是3的倍数,而且基因不包含三元组ATG.TAG.TAA和TGA.编写程序提示用户输入一个基因组,然后显示基因组里的所有基因.如果在输入序列中没有找到基因,那么程序显示“no gene is found” s=input('Please input the Gene String:\r\n') endsplit=[

面试题:在一个数组中有0-99之间的整数101个(数组无序),用高效方法找出其中的唯一的重复元素!

/* * 问题:找出101个数据中重复的元素 * 题目如下:现有0到99,共计100个整数,各不相同,将所有数放入一个数组,随机排布. *        数组长度101,多余的数字是0到99其中任意一个数(唯一重复的数字) *        请将这个重复的数字找出来 * 分析: *    A:把数组构造出来 *    B:把数组元素添加进去 *    C:对数组的元素进去打乱(随机分布) *    D:找出重复的元素 */ 这道题有三种方式:第一种用交换排序找出,第二种求数组的和再减去0-99,

找出两个数组相同的元素

题目:找出两个数组(有重)相同的元素,两种方法 public class 出两个数组相同的元素 { public static void main(String[] args) { // TODO Auto-generated method stub String[] test1 = {"damon","happy","ly","good","losers"}; String[] test2 = {&quo

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

怎么从一个集合中获取最大或最小的N个元素列表? heapq模块有两个函数:nlargest() 和 nsmallest() 可以完美解决这个问题. In [39]: import heapq In [40]: nums = [2, 5, 3, 4] In [41]: heapq.nlargest(2,nums) Out[41]: [5, 4] In [42]: heapq.nsmallest(2,nums) Out[42]: [2, 3] 两个函数都能接受一个关键字参数,用于更复杂的数据结构中: