对于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. TCO'10 Online Round 3 1000pt

    题目大意: 密码串由小写字母.大写字母和数字组成,要求求出小写字母个数不少于L个.大写字母个数不少于U个.数字个数不少于D个的长度为N密码串的种数. 答案对 1000000009 取模 解题思路: 自 ...

  2. react-native 组件默认属性(defaultProps) 及 属性类型验证(PropTypes)

    1.所有的属性类型 2.代码 import PropTypes from 'prop-types'; type Props = {}; export default class App extends ...

  3. 拒绝IP登陆

    tail -n 30 /var/log/messages 发现很多IP尝试登陆,直接封禁. 解决方案:1. vi /etc/hosts.allow 添加 sshd:143.63.182.238 [注意 ...

  4. java 乱码问题解决思路

    "编码一致的条件下,在处理运行正常的情况下,是不会出现乱码的",记住这句金言. 如上所说,如果编码一致是不会出现这种乱码问题,所以解决办法就是仔细再仔细的检查所设置的编码是否是一致 ...

  5. HTTP图解--了解Web及网络基础

    1.网络基础TCP/IP 通常使用的网络是在TCP/IP协议族的基础上运行的,http属于它内部的一个子集. TCP/IP协议族按层次分别分为:应用层.传输层.网络层和数据链路层.分层的好处在于各司其 ...

  6. Security Testing Basics

    Security Testing BasicsSoftware security testing is the process of assessing and testing a system to ...

  7. StringUtils工具类详解

    StringUtils判断字符串大概有四种方法: 下面是 StringUtils 判断是否为空的示例: 判断是否为空,但是要注意,空格不算空,这个最好能不用则不用. StringUtils.isEmp ...

  8. PDO中捕获SQL语句中的错误

    使用默认模式-----PDO::ERRMODE_SILENT 在默认模式中设置PDOStatement对象的errorCode属性,但不进行其它不论什么操作. 比如: 通过prepare()和exec ...

  9. lua学习笔记(四)

      表达式   算术操作符     +(加法) -(减法) *(乘法) /(除法) ^(指数) %(取模) -(负号)     x%1的结果是x的小数部分,x-x%1是整数部分   关系操作符     ...

  10. LCD屏背光驱动调试心得---血的教训

    开发板:明远智睿MY-IMX6-EK140 内核源码:linux-3.14.52 背光驱动IC:MP3202 调光原理:通过开发板的核心板PWM4引脚控制MP3202的EN脚,输出不同的占空比从而达到 ...