提出问题:

如何在某集合里面找出最大或最小的K个元素。

解决思路:

找出最大或最下的K个元素,可以使用Python库中的heapq模块,该模块提供两个函数nlargest()求最大K个和nsmallest()求最小K个。

下面我们举例说明:

import heapqnums=[12,-9,-3,32,9,56,23,0,11,34]
print(heapq.nlargest(4,nums))   #-->最大的4个
print(heapq.nsmallest(4,nums))  #-->最小的4个

运行结果:

[56, 34, 32, 23]
[-9, -3, 0, 9]

分析下,nlargest()和nsmallest()函数有两个参数,第一个参数是求最大或最下的K个元素,第二个参数是待查询的集合。除此之外,他们也可以接受一个参数key,这使得他们处理更加复杂的数据结构。例如:

import heapq
portfolio = [
{'name': 'IBM', 'shares': 100, 'price': 91.1},
{'name': 'AAPL', 'shares': 50, '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}
]cheap = heapq.nsmallest(3, portfolio, key=lambda s: s['price'])
print(cheap)
expensive = heapq.nlargest(3, portfolio, key=lambda s: s['price'])
print(expensive)

运行结果:

[{'name': 'YHOO', 'shares': 45, 'price': 16.35}, {'name': 'FB', 'shares': 200, 'price': 21.09}, {'name': 'HPQ', 'shares': 35, 'price': 31.75}]
[{'name': 'AAPL', 'shares': 50, 'price': 543.22}, {'name': 'ACME', 'shares': 75, 'price': 115.65}, {'name': 'IBM', 'shares': 100, 'price': 91.1}]

深入讨论:

假如说,我们正在寻找某集合中最大或最下的K个元素,并且N的数值很小,如果再使用上面的方法,可能就不是最好的选择。那么,我们介绍heapify()函数,这个函数首先会在底层将数据转换成列表,并且元素会以堆的顺序排列。举例:

从上面的代码中,我们看出元素确实是以堆的顺序排列的,同时堆hea_num[0]对应的元素-9总是最小的。在heapq()模块中还提供heappop()函数,该方法会把第一个元素(最小的)给弹出来,然后第二小的元素会自动补位,它的操作时间复杂度是O(log N),其中N代表的是堆的大小。

具体的操作看下面的代码:

总结一下:

  1. 当要查找的元素数量比较少的时,适合使用nlargest()和nsmallest()
  2. 当只查找集合中最大或最小的1个元素时,推荐使用min()和max()
  3. 当N和集合本身大小差不多时,应该是先对集合排序,然后做切片操作(比如:sorted(items)[:N]或sorted(items)[-N:])

Python从N个数中找到最大的K个数相关推荐

  1. 大顶堆,n个数中找最小的k个数

    package com.alo.offer;import java.util.Scanner;/*** n个数中找到最小的m个数 使用大顶堆* n个书中找到最大的m个数 使用小顶堆* @author ...

  2. topK问题——N个数中取最大的K个数

    topK问题 在海量数据中找出出现频率最高的前k个数,或者从海量数据中找出最大的前k个数,这类问题通常被称为topK问题. N个数中取最大的K个数,用小根堆:N个数中取最小的K个数,用大根堆:时间复杂 ...

  3. Python - 返回 1:n 中所有可能的 k 个数的组合

    一.引言 给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合. 示例: 输入: n = 4 k = 2 输出: [[2,4],[3,4],[2,3],[1,2],[1,3], ...

  4. 如何在10亿个数中找到前1000大的数?

    2019独角兽企业重金招聘Python工程师标准>>> 如何在10亿个数中找到前1000大的数? 定位 TopN问题 算法 排序不是最优的解决方案: 可以考虑分治法: 类似快速排序中 ...

  5. n个数中找最大数c语言,N个数中找到第K大的数值(C语实现)

    N个数中找到第K大的数值(C语实现) N个数中找到第K大的数值(C语实现) 研究生了,选了计算机算法这门课程,这周布置了一个作业,在OJ上做:**N个数中找到第K大的数值**.大一简单学过C语言基础, ...

  6. 给定一个数t,以及n个整数,在这n个数中找到加和为t的所有组合

    [题目]给定一个数t,以及n个整数,在这n个数中找到加和为t的所有组合,例如t = 4, n = 6,这6个数为 [4, 3, 2, 2, 1, 1],这样输出就有4个不同的组合它们的加和为4: 4, ...

  7. 单向链表中查找倒数第K个数

    问题 单向链表如果要找某一元素或者遍历链表,只能从头节点开始,所以如果我们用普通方法查找倒数第K个数,要分两步:第一步:先遍历链表中元素的个数,第二步:从头开始遍历,遍历到链表个数-k个数; 用两个指 ...

  8. 求任意10个数中的正数之和及个数,函数实现体会地址传递

    求任意10个数中的正数之和及个数,函数实现体会地址传递 代码如下 代码如下,小伙伴耐心点,不懂就评论 #include<stdio.h> #include<math.h> vo ...

  9. JAVA算法:给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合(JAVA)

    JAVA算法:给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合(JAVA) 给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合.. 当 n = 4 ...

最新文章

  1. Exchange2010SP1配置OWA下次登录时更改密码提醒
  2. springboot1.5升级2.0后遇到的问题
  3. Java——容器(Comparable)
  4. centos7环境下ELK部署之elasticsearch
  5. 清华教授转述:读博6年未毕业被认定为自控力不够,或将影响个人贷款额度
  6. LeetCode 1657. 确定两个字符串是否接近
  7. 高通骁龙cpu排行_骁龙系列处理器性能分析,你的手机是什么处理器?
  8. IDEA中svn无法提交的问题解决方案Waring:not all local changes may be shown due:ClassCastException
  9. filter过滤器_Java过滤器Filter讲解(Java基础)
  10. 高吞吐低延迟Java应用的垃圾回收优化
  11. UINavigationController与UITabbarController的样式
  12. 重写了GVBASIC模拟器
  13. leetcode数组汇总_LeetCode刷题实战74:搜索二维矩阵
  14. Oracle Ravello的学习资料
  15. adb shell循环命令_android adb实用命令小结
  16. python股票分析系统代码_Python 代码学习,用于股票分析
  17. 什么是Type-c口?Type-c口有什么优势?
  18. 异构数据库10T数据迁移方案
  19. LeetCode 41
  20. 传智播客技术社区_播客与网络技术的未来

热门文章

  1. mysql的length函数和char_length中文字符长度计算函数
  2. 二叉树的遍历实现-2(三级)
  3. 为什么要用dubbo,dubbo和zookeeper关系
  4. mysql主机咋填_mysql数据库主机填什么
  5. ft232r usb uart驱动 win7_新电脑想装WIN7,技术员让装WIN10,不是忽悠你,是有原因的...
  6. 200813_C指针
  7. 013PHP文件处理——filemtime filectime fileatime date_default_timezone_set touch
  8. 网线制作(一根网线劈开给2台同时上网使用)
  9. 数据中心里的应急关机技术
  10. response.setStatus的时机