找到最大或最小的N个值
对于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, '拉塞尔')]
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理