Python从N个数中找到最大的K个数
提出问题:
如何在某集合里面找出最大或最小的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代表的是堆的大小。
具体的操作看下面的代码:
总结一下:
- 当要查找的元素数量比较少的时,适合使用nlargest()和nsmallest()
- 当只查找集合中最大或最小的1个元素时,推荐使用min()和max()
- 当N和集合本身大小差不多时,应该是先对集合排序,然后做切片操作(比如:sorted(items)[:N]或sorted(items)[-N:])
Python从N个数中找到最大的K个数相关推荐
- 大顶堆,n个数中找最小的k个数
package com.alo.offer;import java.util.Scanner;/*** n个数中找到最小的m个数 使用大顶堆* n个书中找到最大的m个数 使用小顶堆* @author ...
- topK问题——N个数中取最大的K个数
topK问题 在海量数据中找出出现频率最高的前k个数,或者从海量数据中找出最大的前k个数,这类问题通常被称为topK问题. N个数中取最大的K个数,用小根堆:N个数中取最小的K个数,用大根堆:时间复杂 ...
- Python - 返回 1:n 中所有可能的 k 个数的组合
一.引言 给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合. 示例: 输入: n = 4 k = 2 输出: [[2,4],[3,4],[2,3],[1,2],[1,3], ...
- 如何在10亿个数中找到前1000大的数?
2019独角兽企业重金招聘Python工程师标准>>> 如何在10亿个数中找到前1000大的数? 定位 TopN问题 算法 排序不是最优的解决方案: 可以考虑分治法: 类似快速排序中 ...
- n个数中找最大数c语言,N个数中找到第K大的数值(C语实现)
N个数中找到第K大的数值(C语实现) N个数中找到第K大的数值(C语实现) 研究生了,选了计算机算法这门课程,这周布置了一个作业,在OJ上做:**N个数中找到第K大的数值**.大一简单学过C语言基础, ...
- 给定一个数t,以及n个整数,在这n个数中找到加和为t的所有组合
[题目]给定一个数t,以及n个整数,在这n个数中找到加和为t的所有组合,例如t = 4, n = 6,这6个数为 [4, 3, 2, 2, 1, 1],这样输出就有4个不同的组合它们的加和为4: 4, ...
- 单向链表中查找倒数第K个数
问题 单向链表如果要找某一元素或者遍历链表,只能从头节点开始,所以如果我们用普通方法查找倒数第K个数,要分两步:第一步:先遍历链表中元素的个数,第二步:从头开始遍历,遍历到链表个数-k个数; 用两个指 ...
- 求任意10个数中的正数之和及个数,函数实现体会地址传递
求任意10个数中的正数之和及个数,函数实现体会地址传递 代码如下 代码如下,小伙伴耐心点,不懂就评论 #include<stdio.h> #include<math.h> vo ...
- JAVA算法:给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合(JAVA)
JAVA算法:给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合(JAVA) 给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合.. 当 n = 4 ...
最新文章
- Exchange2010SP1配置OWA下次登录时更改密码提醒
- springboot1.5升级2.0后遇到的问题
- Java——容器(Comparable)
- centos7环境下ELK部署之elasticsearch
- 清华教授转述:读博6年未毕业被认定为自控力不够,或将影响个人贷款额度
- LeetCode 1657. 确定两个字符串是否接近
- 高通骁龙cpu排行_骁龙系列处理器性能分析,你的手机是什么处理器?
- IDEA中svn无法提交的问题解决方案Waring:not all local changes may be shown due:ClassCastException
- filter过滤器_Java过滤器Filter讲解(Java基础)
- 高吞吐低延迟Java应用的垃圾回收优化
- UINavigationController与UITabbarController的样式
- 重写了GVBASIC模拟器
- leetcode数组汇总_LeetCode刷题实战74:搜索二维矩阵
- Oracle Ravello的学习资料
- adb shell循环命令_android adb实用命令小结
- python股票分析系统代码_Python 代码学习,用于股票分析
- 什么是Type-c口?Type-c口有什么优势?
- 异构数据库10T数据迁移方案
- LeetCode 41
- 传智播客技术社区_播客与网络技术的未来
热门文章
- mysql的length函数和char_length中文字符长度计算函数
- 二叉树的遍历实现-2(三级)
- 为什么要用dubbo,dubbo和zookeeper关系
- mysql主机咋填_mysql数据库主机填什么
- ft232r usb uart驱动 win7_新电脑想装WIN7,技术员让装WIN10,不是忽悠你,是有原因的...
- 200813_C指针
- 013PHP文件处理——filemtime filectime fileatime date_default_timezone_set touch
- 网线制作(一根网线劈开给2台同时上网使用)
- 数据中心里的应急关机技术
- response.setStatus的时机