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

news2025/1/20 3:47:44

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 False
   return 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 返回值:1

bisect.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.coloradmin.cn/o/1339860.html

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

相关文章

Flink1.17实战教程(第三篇:时间和窗口)

系列文章目录 Flink1.17实战教程&#xff08;第一篇&#xff1a;概念、部署、架构&#xff09; Flink1.17实战教程&#xff08;第二篇&#xff1a;DataStream API&#xff09; Flink1.17实战教程&#xff08;第三篇&#xff1a;时间和窗口&#xff09; Flink1.17实战教程&…

JUC JMM Java 内存模型

文章目录 计算机存储系统高速缓冲存储器一致性 JMM&#xff08;Java Memory Model&#xff09;可见性原子性有序性指令重排Happens-Before 原则 volatile 关键字volatile 保证可见性volatile 不能保证原子性volatile 禁用指令重排&#xff08;保证有序性&#xff09;内存屏障&a…

Unity 代码控制Text自适应文本高度

在使用代码给Text赋值时&#xff0c;且文本有多段&#xff0c;并需要根据实际文本高度适配Text组件的高度时&#xff0c;可以使用以下方法&#xff1a; //Text文本 public TextMeshProUGUI text;void Start() {//代码赋值文本text.text "好!\n很好!\n非常好!";//获…

Spring系列学习三、Spring的基础组件

Spring的基础组件 一、 什么是Bean及Bean的生命周期二、 什么是依赖注入(DI)与控制反转(IOC)三、 Spring的作用域与生命周期四、 Spring的配置方式(XML与基于注解的配置)五、HelloWorld示例六、结语 欢迎回来各位亲爱的小伙伴&#xff01;我们已经滑过Spring的门槛&#xff0c;…

Unity中URP下的添加雾效支持

文章目录 前言一、URP下Shader支持雾效的步骤1、添加雾效变体2、在Varying结构体中添加雾效因子3、在顶点着色器中&#xff0c;我们使用内置函数得到雾效因子4、在片元着色器中&#xff0c;把输出颜色 和 雾效因子混合输出 二、在Unity中打开雾效三、测试代码 前言 我们使用之…

mapboxgl 中热力图的实现以及给热力图点增加鼠标移上 popup 效果

文章目录 概要效果预览技术思路技术细节小结 概要 本篇文章还是关于最近做到的 mapboxgl 地图展开的。 借鉴官方示例&#xff1a;https://iclient.supermap.io/examples/mapboxgl/editor.html#heatMapLayer 效果预览 技术思路 将接口数据渲染到地图中形成热力图。还需要将热…

机器学习深度学习面试笔记

机器学习&深度学习面试笔记 机器学习Q. 在线性回归中&#xff0c;如果自变量之间存在多重共线性&#xff0c;会导致什么问题&#xff1f;如何检测和处理多重共线性&#xff1f;Q. 什么是岭回归(Ridge Regression)和Lasso回归(Lasso Regression)&#xff1f;它们与普通线性回…

西北大学844计算机类考研-25级初试高分总攻略

西北大学844计算机类考研-25级初试高分攻略 个人介绍 ​ 本人是西北大学22级软件工程研究生&#xff0c;考研专业课129分&#xff0c;过去一年里在各大辅导机构任职&#xff0c;辅导考研学生专业课844&#xff0c;辅导总时长达400小时&#xff0c;辅导学生超过20余人&#xf…

交换域系数的选择:图像处理与编码的关键策略

在图像处理和编码领域&#xff0c;选择适当的交换域系数对于实现高效的图像处理和编码至关重要。交换域系数是指在特定的数学变换下产生的频域系数。通过选择合适的交换域系数&#xff0c;可以实现图像的压缩、增强和重构。本文将深入探讨交换域系数的选择在图像处理和编码中的…

中小企业运营难题:CRM系统为您解决!

​CRM如何帮助中小企业解决业务与团队之间的问题&#xff1f;它可以帮助企业获取潜在客户、数据储存管理、建立标准化流程、减少客户流失、促进客户沟通等。客户关系管理的核心理念要以客户为最主要的资源&#xff0c;提供全面的客户服务&#xff0c;满足客户要求&#xff0c;实…

如何从huggingface上下载模型

现在通过git 的方式已经几乎下载不到huggingface上的东西了。不过我们还可以使用huggingface-cli实现快速下载&#xff0c;以openlm-research/open_llama_3b_v2为例。 首先安装huggingface-cli pip install -U huggingface_hub 接下来使用&#xff1a; huggingface-cli downloa…

2023年华为OD机试(python)B卷-符合要求的结对方式

一、题目 题目描述&#xff1a; 用一个数组A代表程序员的工作能力&#xff0c;公司想通过结对编程的方式提高员工的能力&#xff0c;假设结对后的能力为两个员工的能力之和&#xff0c;求一共有多少种结对方式使结对后能力为N。 二、输入输出 输入描述: 5 1 2 2 2 3 4 第一行为…

丰田「退股」电装,传统汽车供应链体系走到十字路口

就在中国市场热衷于车企与零部件厂商的合纵连横之际&#xff0c;本周&#xff0c;传统汽车巨头丰田公司宣布&#xff0c;将出售部分电装&#xff08;Denso&#xff09;公司股份&#xff0c;资金用于投入电动化、智能驾驶等新技术研发。 按照计划&#xff0c;丰田汽车拟出售超过…

python之Selenium WebDriver安装与使用

首先把python下载安装后&#xff0c;再添加到环境变量中&#xff0c;再打开控制台输入: pip install selenium 正常情况下是安装好的&#xff0c;检查一下“pip show selenium”命令&#xff0c;出现版本号就说明安装好了。 1&#xff1a;如果出现安装错误&#xff1a; 那就用“…

2024年HTML+CSS+JS 网页版烟花代码

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 直接跳到末尾 获取完整源码 在线体验地址&…

【docker实战】02 用docker安装mysql

本示例采用bitnami的镜像进行安装MySQL 一、镜像搜索 先搜索一下mysql有哪些镜像 [rootlocalhost ~]# docker search mysql NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql …

操作系统【设备管理】

设备管理 一、前言 学习了存储器管理后&#xff0c;继续学习设备管理&#xff0c;设备管理的主要功能有缓冲区管理、设备分配、设备处理、虚拟设备及实现设备独立性等&#xff0c;由于I/O设备不仅种类繁多&#xff0c;而且他们的特性和操作方式往往相差甚大&#xff0c;使得设…

leetcode贪心算法题总结(一)

此系列分三章来记录leetcode的有关贪心算法题解&#xff0c;题目我都会给出具体实现代码&#xff0c;如果看不懂的可以后台私信我。 本章目录 1.柠檬水找零2.将数组和减半的最少操作次数3.最大数4.摆动序列5.最长递增子序列6.递增的三元子序列7.最长连续递增序列8.买卖股票的最…

SpringBoot发布项目到docker

Dockerfile FROM openjdk:11 # 作者 MAINTAINER chenxiaodong<2774398338qq.com># 安装 vim # RUN yum -y install vim# 环境变量 # 进入容器后的默认工作目录 ENV WORKPATH /usr/local/webapp ENV EXECFILE Docker2Application-0.0.1-SNAPSHOT.jarRUN mkdir -p $WORKPA…

数据探查系列:如何进行有意义的探索性数据分析(EDA)

如何进行有意义的探索性数据分析&#xff08;EDA&#xff09; 目录 1. 设置 1.1 导入库1.2 导入数据1.3 数据集特征1.4 数据集属性 2. 探索训练集和测试集 2.1 训练集 - 快速概览2.2 训练集 - 基本统计2.3 测试集 - 快速概览2.4 测试集 - 基本统计 3. 特征分布4. 数据不平衡检查…