对于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. Android无数据线调试方法

    平时在Android设备上调试程序.通常是将Android设备用数据线和PC机相连. 可是,在没有数据线的情况下也能够: 1.将PC机和Android设备连到同一网段. 2.获取Android设备的I ...

  2. Windows操作系统设置代理

    1.打开控制面板 2.点击网络和Internet 3.点击Internet选项 4.点击连接Tab页 5.点击局域网设置 6.选中代理服务器 7.输入代理的地址和端口号

  3. <p>在静态类junit.framework.Assert或者静态类org.junit.Assert中存在下面几个方法</p>

    在静态类junit.framework.Assert或者静态类org.junit.Assert中存在下面几个方法 1.assertEquals()方法,用来查看对象中存的值是否是期待的值,与字符串比較 ...

  4. C语言 | 基础知识点笔记

    函数 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ...

  5. Spring使用经验之StandardServletMultipartResolver实现文件上传的基本配置

    Note:Spring使用版本是4.1.6.RELEASE 1. 在实现了AbstractAnnotationConfigDispatcherServletInitializer的类中重载custom ...

  6. SQL优化的一些总结 SQL编写一般要求

    SQL编写一般要求---SQL语句尽可能简单---分解联接保证高并发---同数据类型的列值比较---不在索引列做运算---禁止使用SELECT *---避免负向查询和%前缀模糊查询---保持事务(连接 ...

  7. ps选框工具全解

    我们每次选择工具的时候,ps上面都会变成特定的选项,比如说下面这些: 比如说选区工具的话就分为新选区.添加选区.交叉选区之类的,这些都是需要在实战中练习的. 不单单是选区有这个工具,其他的也有这个功能 ...

  8. Weka学习之认识weka(一)

     Weka 简介   WEKA作为一个公开的数据挖掘工作平台,集合了大量能承担数据挖掘任务的机器学习算法,包括对数据进行预处理,分类,回归.聚类.关联规则以及在新的交互式界面上的可视化. Weka是基 ...

  9. IDEA中配置svn

    反正这个命令行我是勾选了的,软件占用内存不大,我就都选了. 然后是配置IDEA 试一下效果,果然阔以,哈哈.

  10. Parencodings - poj 1068

      Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 22764   Accepted: 13344 Description L ...