当前位置: 首页 > news >正文

Python cookbook笔记——求N个最大最小元素及lambda表达式

问题: 在某集合中找出最大或最小的N个元素

heapq模块: nlargest( ), nsmallest( )

import heapq


nums = [1, 8, 2, 23, 7, -4, 18, 23, 42, 37, 2]
print(heapq.nlargest(3, nums))
print(heapq.nsmallest(3, nums))

portinfo = [
{'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, portinfo, key=lambda s: s['price'])
expensive = heapq.nlargest(3, portinfo, key=lambda s: s['price'])
print(cheap, expensive)

lambda表达式通常是在需要一个函数,但简单起见不想命名它的场合下使用,即匿名函数,

所表示的匿名函数的内容应该是很简单的,如果复杂的话,干脆就重新定义一个函数了,使用lambda就有点过于执拗了。

 
 

lambda就是用来定义一个匿名函数的,如果还要给他绑定一个名字的话,就会显得有点画蛇添足,通常是直接使用lambda函数。如下所示:

 
 
add = lambda x, y : x+y add(1,2) # 结果为3 
 

如何使用lambda表达式呢?

1、应用在函数式编程中

 
 

Python提供了很多函数式编程的特性,如:map、reduce、filter、sorted等这些函数都支持函数作为参数,lambda函数就可以应用在函数式编程中。如下:

 
 
# 需求:将列表中的元素按照绝对值大小进行升序排列
list1 = [3,5,-4,-1,0,-2,-6] sorted(list1, key=lambda x: abs(x)) 
 
 

常规方法:

 
 
list1 = [3,5,-4,-1,0,-2,-6] def get_abs(x): return abs(x) sorted(list1,key=get_abs) 

2、应用在闭包中

def get_y(a,b): return lambda x:ax+b y1 = get_y(1,1) y1(1) # 结果为2 
 
 

当然,也可以用常规函数实现闭包,如下:

def get_y(a,b): def func(x): return ax+b return func y1 = get_y(1,1) y1(1) # 结果为2 

Explicit is better than implicit(明了胜于晦涩),就是说那种方式更清晰就用哪一种方式,不要盲目的都使用lambda表达式。

讨论:

1)如果同集合中的元素总数相比N很小,那么堆排序可以提供更好的性能:

堆最重要的特性就是heap[0]总是最小的元素,heapq.pop()会将第一个元素弹出,并用第二小的元素取代 操作复杂度log(N)

2)要找的元素数量相对较小时,函数nsmallest()和nlargest()才是最适用的

3)单纯要找最小或最大的元素,min()和max()会更快

4)N和元素总数差不多,先对集合排序再做切片操作sorted(items)[:N]或sorted(items)[-N:]

注:nlargest和nsmallest的实际实现会根据使用它们的方式而有所不同,可能相应作出一些优化措施,如当N与总数接近就会采用排序法

转载于:https://www.cnblogs.com/QiLF/p/9329129.html

相关文章:

  • restful 学习地址
  • Flutter 开发一个 GitHub 客户端 | 掘金技术征文
  • brk/sbrk的使用
  • 我们要和你完成一件大事
  • Eclipse中文乱码问题
  • Vue 动态创建 component
  • ACM经典问题--布线问题(三)
  • 自然语言处理--Word2vec(一)
  • HDU3068(最长回文串)
  • redis初识
  • 头指针与头结点的异同
  • Npoi将excel数据导入到sqlserver数据库
  • OpenStack导入镜像后Launch不起来的几个问题
  • zookeeper 面试题 有用
  • 如何写PHP规范注释
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • Cookie 在前端中的实践
  • Create React App 使用
  • ES6 ...操作符
  • github从入门到放弃(1)
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • JavaScript对象详解
  • Spring Cloud中负载均衡器概览
  • Vue.js-Day01
  • 爱情 北京女病人
  • 初识 beanstalkd
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 学习使用ExpressJS 4.0中的新Router
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 阿里云API、SDK和CLI应用实践方案
  • 选择阿里云数据库HBase版十大理由
  • ​2021半年盘点,不想你错过的重磅新书
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • #WEB前端(HTML属性)
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (3)llvm ir转换过程
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (k8s中)docker netty OOM问题记录
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (三)终结任务
  • (转)编辑寄语:因为爱心,所以美丽
  • .htaccess配置常用技巧
  • .NET Core 中的路径问题
  • .NET DevOps 接入指南 | 1. GitLab 安装
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .ui文件相关
  • /etc/fstab 只读无法修改的解决办法
  • [1525]字符统计2 (哈希)SDUT
  • [2018][note]用于超快偏振开关和动态光束分裂的all-optical有源THz超表——
  • [2021 蓝帽杯] One Pointer PHP
  • [⑧ADRV902x]: Digital Pre-Distortion (DPD)学习笔记
  • [AIGC] Redis基础命令集详细介绍