python的二分查找库bisect,可用于简化繁琐的if条件分支

if条件分支的函数

之前实现了一个函数功能,大意是根据不同的时间天数,返回不同的值。

def analyse_value(days_num:int):if days_num == 1:value = 'RD1d'elif days_num > 1 and days_num <= 7:value = 'RD7d'elif days_num > 7 and days_num <= 14:value = 'RD14d'elif days_num > 14 and days_num <= 21:value = 'RD21d'elif days_num > 21 and days_num <= 30:value = 'RD1m'elif days_num > 30 and days_num <= 60:value = 'RD2m'elif days_num > 60 and days_num <= 90:value = 'RD3m'elif days_num > 90 and days_num <= 180:value = 'RD6m'elif days_num > 180 and days_num <= 365:value = 'RD1y'else:print('.....ERROR:输入值不在范围')return Falsereturn value

函数运行结果:

print(f'输入天数:1 返回值:{analyse_value(1)}')
print(f'输入天数:7 返回值:{analyse_value(7)}')
print(f'输入天数:8 返回值:{analyse_value(8)}')
print(f'输入天数:14 返回值:{analyse_value(14)}')
print(f'输入天数:90 返回值:{analyse_value(90)}')print(f'输入天数:91 返回值:{analyse_value(91)}')#结果如下输入天数:1 返回值:RD1d输入天数:7 返回值:RD7d输入天数:8 返回值:RD14d输入天数:14 返回值:RD14d输入天数:90 返回值:RD3m输入天数:91 返回值:RD6m

函数本身很简单,输入一个数字,经过不同的if条件分支判断,返回约定的值。

这样看上去比较简单易懂,但是实际上条件分支较多,想着如何优化下,也搜了一些资料,发现了python自带的二分查找库bisect,正好可以解决这个问题。

bisect 库简要介绍

bisect是 python 内置模块,用于有序序列的插入和查找。

bisect是实现 二分 (bisection) 算法 的模块,能够保持序列顺序不变的情况下对其进行 二分查找和插入

分析:上面的函数中,我们用到的天数分别是1,7,14,21,30,60,90,180,365,判断条件中基本都是统一的判断逻辑:数字都是大于1个值,同时小于等于另一个值。

那么正好可以使用到bisect中的bisect_left函数,该函数的作用是在有序列表中查找将值插入的位置,并返回左侧的索引(相同值的最左边位置)

比较难理解,我们举个例子:

列表a :[1,6,8]   数字6插入到列表中,因为已经有一个数字6,bisect_left函数返回列表中数字6的索引为1,而如果使用bisect或者bisect_right函数返回的是数字6右边对应的索引为2。

lista = [1,6,8]
print(f'bisect.bisect_left 返回值:{bisect.bisect_left(lista,6)}')
print(f'bisect.bisect_right  返回值:{bisect.bisect_right(lista,6)}')结果:bisect.bisect_left 返回值:1bisect.bisect_right  返回值:2

基于以上理解我们将上面的天数定义为一个列表[1,7,14,21,30,60,90,180,365],将返回值也定义为一个列表['RD1d','RD7d','RD14d','RD21d','RD1m','RD2m','RD6m','RD3m','RD6m','RD1y'],两个列表一一对应。

这样我们将时间天数插入到列表中得到左边的索引,然后就能根据索引得到返回值。

使用bisect_left函数

 函数优化如下:


def analyse_value(days_num:int):lista = [1,7,14,21,30,60,90,180,365]listb = ['RD1d','RD7d','RD14d','RD21d','RD1m','RD2m','RD3m','RD6m','RD1y']return listb[bisect.bisect_left(lista,days_num)]

还是输入同样的天数,我们看下结果跟原函数结果一致。

print(f'输入天数:1 返回值:{analyse_value(1)}')
print(f'输入天数:7 返回值:{analyse_value(7)}')
print(f'输入天数:8 返回值:{analyse_value(8)}')
print(f'输入天数:14 返回值:{analyse_value(14)}')
print(f'输入天数:90 返回值:{analyse_value(90)}')
print(f'输入天数:91 返回值:{analyse_value(91)}')结果:得到的结果跟原函数值是一致的。输入天数:1 返回值:RD1d输入天数:7 返回值:RD7d输入天数:8 返回值:RD14d输入天数:14 返回值:RD14d输入天数:90 返回值:RD3m输入天数:91 返回值:RD6m

bisect其他函数insort_leftinsort_right是将某个值插入到有序列表的最左侧或者最右侧

以下是一个举例:

lista = [1,6,8]
bisect.insort_left(lista,5)
print(f'bisect.insort_left插入后列表:{lista}')
bisect.insort_right(lista,7)
print(f'bisect.insort_left插入后列表:{lista}')结果:bisect.insort_left插入后列表:[1, 5, 6, 8]bisect.insort_left插入后列表:[1, 5, 6, 7, 8]

共勉: 东汉·班固《汉书·枚乘传》:“泰山之管穿石,单极之绠断干。水非石之钻,索非木之锯,渐靡使之然也。”

-----指水滴不断地滴,可以滴穿石头;

-----比喻坚持不懈,集细微的力量也能成就难能的功劳。

----感谢读者的阅读和学习,谢谢大家。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/581731.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++智能指针的简单实现,原理及应用

1. 为什么C引入了智能指针&#xff1f; 在C中&#xff0c;引入智能指针主要是为了解决原始指针在使用过程中可能出现的内存泄漏问题。内存泄漏是程序在申请内存后&#xff0c;无法释放已分配的内存&#xff0c;导致内存被无效占用&#xff0c;严重时可能导致系统运行缓慢甚至崩…

Redis6.0 Client-Side缓存是什么

前言 Redis在其6.0版本中加入了Client-side caching的支持&#xff0c;开启该功能后&#xff0c;Redis可以将指定的key-value缓存在客户端侧&#xff0c;这样当客户端发起请求时&#xff0c;如果客户端侧存在缓存&#xff0c;则无需请求Redis Server端。 Why Client-side Cac…

【每日一题】【12.24】 - 【12.28】

&#x1f525;博客主页&#xff1a; A_SHOWY&#x1f3a5;系列专栏&#xff1a;力扣刷题总结录 数据结构 云计算 数字图像处理 力扣每日一题_ 本周总结&#xff1a;本周的每日一题比较针对于数学问题的一个应用&#xff0c;如二元一次方程组的求解或者数组求和&#xff0c;同…

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用UserSet功能保存和载入相机的各类参数(C++)

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用UserSet功能保存和载入相机的各类参数&#xff08;C&#xff09; Baumer工业相机Baumer工业相机NEOAPISDK中UserSet的技术背景代码案例分享第一步&#xff1a;保存相机当前参数设置UserSet_Save第二步&#xff1a;载入已经保存…

C++第2关:文件读取和写入

任务描述 题目描述:从文件a.txt中读取三个整数&#xff0c;然后把这三个整数保存到b.txt中&#xff0c;两整数之间一个空格。 相关知识&#xff08;略&#xff09; 编程要求 根据提示&#xff0c;在右侧编辑器Begin-End处补充代码&#xff0c;完成本关要求。 格式如下: 10…

IDEA、VSCode等快速连接Github(Mac版)

问题描述 在本地书写✍️完代码后, 想要git push到Github上面, 出现延迟错误; 导致经常push不上去, 如下图所示; 解决方案 进入电脑终端; 输入下列命令; sudo vim /etc/hosts输入密码; 按下 I 键, 进行编辑操作; 将下列语句复制到空白区, 然后按下esc按键, 然后输入:wq即可…

矿泉水硝酸盐和溴酸盐超标解决工艺

在当今社会&#xff0c;人们对健康和优质生活的追求不断提升&#xff0c;使得瓶装饮用水的安全问题受到了广泛关注。溴酸盐和硝酸盐作为自然水体中常见的物质&#xff0c;若在矿泉水中含量过高&#xff0c;可能会对消费者的健康构成潜在威胁。因此&#xff0c;探究有效去除矿泉…

AR-HUD厂商发力下一代技术方案,vHOE为何赢得高度关注?

作为智能座舱的核心显示交互系统&#xff0c;AR-HUD正处于处于量产爆发前期&#xff0c;同时关于下一代技术方案的比拼也在全面升级。 根据《高工智能汽车研究院》数据显示&#xff0c;2023年1-9月&#xff0c;中国市场&#xff08;不含进出口&#xff09;乘用车前装标配W/AR …

区块链背后的秘密:从交易看故事

作者&#xff1a;shellyfootprint.network 在区块链的世界里&#xff0c;每一笔交易都是一个故事的开始。不只是数字的交换&#xff0c;更是用户行为、信念和决策的体现。 疯狂投机的背后&#xff0c;是短期的逐利还是长期的策略&#xff1f;协议分叉&#xff0c;真的分裂了社…

双向链表基本操作及顺序和链表总结

目录 基本函数实现 链表声明 总的函数实现声明 创建一个节点 初始化链表 打印 尾插 尾删 头插 头删 查找 pos前插入 删除pos位置 销毁链表 顺序表和链表总结 基本函数实现 链表声明 typedef int DLTDataType;typedef struct DListNode {struct DListNode* nex…

POLL机制

文章目录 一、POLL机制1、应用场景2、执行流程 二、程序1、驱动程序2、测试应用程序 三、总结 一、POLL机制 1、应用场景 使用休眠-唤醒的方式等待某个事件发生时&#xff0c;有一个缺点&#xff1a;等待的时间可能很久。我们可以加上一个超时时间&#xff0c;这时就可以使用…

CAN总线应用篇(c语言版)

一.概述 CAN&#xff08;Controller Area Network&#xff09;即控制器局域网&#xff0c;是一种能够实现分布式实时控制的串行通信网络。想到CAN就要想到德国的Bosch公司&#xff0c;因为CAN就是这个公司开发的&#xff08;和Intel&#xff09;CAN有很多优秀的特点&#xff0c…

百度CTO王海峰:文心一言用户规模破1亿

▶ 写在前面▶ 飞桨开发者已达1070万▶ 文心一言用户规模破亿&#xff0c;日提问量快速增长 ▶ 写在前面 “文心一言用户规模突破 1 亿。”12 月 28日&#xff0c;百度首席技术官、深度学习技术及应用国家工程研究中心主任王海峰在第十届 WAVE SUMMIT 深度学习开发者大会上宣布…

Python初学者必须吃透的69个内置函数!

所谓内置函数&#xff0c;就是Python提供的, 可以直接拿来直接用的函数&#xff0c;比如大家熟悉的print&#xff0c;range、input等&#xff0c;也有不是很熟&#xff0c;但是很重要的&#xff0c;如enumerate、zip、join等&#xff0c;Python内置的这些函数非常精巧且强大的&…

外贸网站建站怎么做?海洋建站有哪些步骤?

外贸网站建站需要哪些资料&#xff1f;如何选择外贸建站系统&#xff1f; 外贸企业越来越重视在线业务&#xff0c;而拥有一个专业、高效的外贸网站已经成为成功开展国际贸易的关键一步。海洋建站将为您详细介绍如何进行外贸网站建站&#xff0c;让您的企业在全球市场中脱颖而…

C++ Qt开发:QItemDelegate自定义代理组件

老规矩&#xff0c;首先推荐好书&#xff1a; Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍…

浏览器Post请求出现413 Request Entity Too Large (Nginx)

环境 操作系统 window server 2016 前端项目 Vue2 Nginx-1.25.3 一、错误信息 前端是vue项目&#xff0c;打包后部署在Nginx上&#xff0c;前端post请求出现Request Entity Too Large错误信息。 ​这种问题一般是请求实体太大&#xff08;包含参数&#xff0c;文件等&#xf…

SpringBoot集成etcd,实现实时监听,实现配置中心

etcd 是一个分布式键值对存储&#xff0c;设计用来可靠而快速的保存关键数据并提供访问。通过分布式锁&#xff0c;leader选举和写屏障(write barriers)来实现可靠的分布式协作。etcd集群是为高可用&#xff0c;持久性数据存储和检索而准备。 以下代码实现的主要业务是&#xf…

复试 || 就业day01(2023.12.27)算法篇

文章目录 前言两数之和存在重复元素 II好数对的数目总持续时间可被 60 整除的歌曲 前言 &#x1f4ab;你好&#xff0c;我是辰chen&#xff0c;本文旨在准备考研复试或就业 &#x1f4ab;文章题目大多来自于 leetcode&#xff0c;当然也可能来自洛谷或其他刷题平台 &#x1f4a…

2023-12-27 Python PC获取鼠标位置,移动鼠标到相应的位置 定时自动模拟鼠标点击,用于简单测试app用

一、核心源码如下&#xff1a; import pyautogui import timepyautogui.moveTo(600, 800) for i in range(20):time.sleep(0.1)x, y pyautogui.position()print("mouse position:", x, y)pyautogui.click()二、定时自动模拟鼠标点击&#xff0c;模拟键盘按键 impo…