对于python原生的数据类型来说,并不存在直接的方法可以找到最大或最小的N个值,

传统的方法必须先排序,然后再截取相应的值,而且对于集合这类数据类型来说还不能直接排序,

需要先转化为列表才行,有的时候非常不便,因此python提供了内置模块heapq可以解决这类问题。

下面分别对列表、集合和字典的角度解决这个需求。

1.列表

#列表
nums = [45,12,4,-5.34,23,76,85,-15,56] # (1)传统方法
nums2 = nums[:]
nums2.sort()
print(nums2[-3:]) #[56, 76, 85] # (2)引入库heapq
#取最大的三个值
print(heapq.nlargest(3,nums))
#结果[85, 76, 56]
print(heapq.nsmallest(3,nums)) #[-15, -5.34, 4]

2.集合

#集合
set1 = {45,12,4,-5,34,23,76,85,-15,56}
# (1)传统方法
#由于集合不能排序,因此需要先将集合转化为列表
list1 = list(set1)
list1.sort()
print(list1[-3:]) #[56, 76, 85] #(2)更时尚的方法
print(heapq.nlargest(3,set1)) #[85, 76, 56]
print(heapq.nsmallest(3,set1)) #[-15, -5, 4]

3.字典

#字典
names = [
{"name":"科比","age":26},
{"name":"大姚","age":38},
{"name":"丁同","age":19},
{"name":"志成","age":11},
{"name":"拉塞尔","age":84},
]
# (1)第一种方法heapq
#找出年龄最大的两位(专门取值的方法)
print(heapq.nlargest(2,names,lambda x:x["age"])) # (2)第二种(传统方法,可以排序,可以取值)
#可以给排序指定一个字典中的键
names.sort(key=lambda x:x["age"])
print(names) # (3)第三种
# 通过公共键对字典排序然后取值,
from operator import itemgetter
new_names = sorted(names,key=itemgetter("age"))
print(new_names[-2:])
# 第三种方法是第二种方法的浓缩,不过如果你知道第三种为何和压迫使用第二种了。

对于字典还可以使用zip反转然后排序

name={"科比":26,"大姚":38,"丁同":19,"拉塞尔":84,"志成":11}
print(sorted(zip(name.values(),name.keys())))
[(11, '志成'), (19, '丁同'), (26, '科比'), (38, '大姚'), (84, '拉塞尔')]

找到最大或最小的N个值的更多相关文章

  1. 找到最大或最小的N个元素

    问题: 想在某个集合中找到最大或最小的N个元素 解决方案: heapq 模块中有两个函数  nlargest() 和 nsmallest()  它们正是我们需要的.例如: import heapq n ...

  2. 相同name,取最小的id的值,mysql根据相同字段 更新其它字段

    id name info1 a 1232 a 2353 a 1244 b 125 b 987相同name,取最小的id的值id name info1 a 1232 a 1233 a 1234 b 12 ...

  3. 用O(1)的时间复杂度,找到栈和队列中的最小(大)值

    最近刷剑指offer,看到两道编程题,考察在O(1)的复杂度内,找出最值. 觉得很有意思,很有借鉴意义,故记录在此. 需要注意的是,这里所说的O(1) 有个前提, 就是已经通过某种容器的存储方式进行初 ...

  4. 【python cookbook】【数据结构与算法】4.找到最大或最小的N个元素

    问题:想在某个集合中找出最大或最小的N个元素 解决方案:heapq模块中的nlargest()和nsmallest()两个函数正是我们需要的. >>> import heapq &g ...

  5. 找到n中最小的k个数

    题目:n个数中,求最小的前k个数. 这道题在各个地方都看到过,在国内出现的频率也非常高. 面完阿里回来听说这道题又被考了,所以还是决定回来写一写,对于这种高频题...顺便再吐槽一下阿里的面试,我竟然一 ...

  6. 找到最大或最小的N个元素---heapq模块

    堆排序heapq的用法 基本用法: 复杂数据结构: # coding=utf- # example.py # Example of using heapq to find the N smallest ...

  7. 自定义栈类型,具有找到站内最小元素的min函数 ,且min(),pop(),push()函数的时间复杂度为O(1)

    基本思想: // 借助一个辅助栈,入栈时,若新元素比辅助栈栈顶元素小,则直接放入辅助站 // 反之,辅助站中放入次小元素(即辅助栈栈顶元素)====保证最小元素出栈时,次小元素被保存 static c ...

  8. HDU 6214 Smallest Minimum Cut 最小割,权值编码

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6214 题意:求边数最小的割. 解法: 建边的时候每条边权 w = w * (E + 1) + 1; 这 ...

  9. 算法 Tricks(三)—— 数组(序列)任意区间最小(大)值

    序列(数组)的区间通过左右端点确定,这样首先设置一个最值变量用来记录最值,从左端点一步步移动到右端点,自然移动的过程中也可以计算整个区间的和,也即一次线性遍历下来,可同时获得多个有用信息. // 区间 ...

随机推荐

  1. 标准库Allocator(三)uninitialized_fill等函数的实现

    前面我们使用了uninitialized_fill,来批量初始化某一段内存. 下面提供三个函数的实现代码,这三个代码的共同点是: 1.遇到错误,抛出异常 2.出现异常时,把之前构造的对象全部销毁 所以 ...

  2. SharedPreferences具体解释(一)——基础知识

    我们在开发软件的时候,常须要向用户提供软件參数设置功能,比如我们经常使用的微信,用户能够设置是否同意陌生人加入自己为好友.对于软件配置參数的保存,假设是在window下通常我们会採用ini文件进行保存 ...

  3. java swing内嵌浏览器,隐藏滚动条

    1 通过定义css样式表来解决 1 html{overflow-y:scoll;overflow:-moz-scrollbars-vertical;} 2 body{width:680px;heigh ...

  4. Ubuntu Server 命令行下显示中文乱码(菱形)解决办法

    如果Ubuntu Server在安装过程中,选择的是中文(很多新手都会在安装时选择中文,便于上手),这样在完成安装后,系统默认的语言将会是中文zh_CN.UTF- 8.但问题是我们安装的是服务器,只需 ...

  5. ASP.NET CORE RAZOR :将文件上传至 ASP.NET Core 中的 Razor 页面

    本部分演示使用 Razor 页面上传文件. 本教程中的 Razor 页面 Movie 示例应用使用简单的模型绑定上传文件,非常适合上传小型文件. 有关流式传输大文件的信息,请参阅通过流式传输上传大文件 ...

  6. sprint3 【每日scrum】 TD助手站立会议第八天

    站立会议 组员 昨天 今天 困难 签到 刘铸辉 (组长) 调整闹钟和整个项目的显示效果,最后做出了微信界面滑动的显示效果 整合原来做过的功能,并做相应的改进,整合其他的功能 在界面的设计和用户交互上始 ...

  7. CNN 防止过拟合的方法

    CNN 防止过拟合的方法 因为数据量的限制以及训练参数的增多,几乎所有大型卷积神经网络都面临着过拟合的问题,目前常用的防止过拟合的方法有下面几种:      1. data augmentation: ...

  8. 配置YUM源更新源

    在虚拟机上更新yum,总是告诉我找不懂镜像服务器地址,配置失败,连 #yum install yum 它自己都无法更新. 于是决定先配置一下yum的更新源. 首先找到yum的主要配置文件, 一般在/e ...

  9. NHibernate 映射基础(第三篇) 简单映射、联合主键

    NHibernate 映射基础(第三篇) 简单映射.联合主键 NHibernate完全靠配置文件获取其所需的一切信息,其中映射文件,是其获取数据库与C#程序关系的所有信息来源. 一.简单映射 下面先来 ...

  10. mysql单表导入数据,全量备份导入单表

    (1)“导出”表 导出表是在备份的prepare阶段进行的,因此,一旦完全备份完成,就可以在prepare过程中通过--export选项将某表导出了: innobackupex --apply-log ...