不使用 if-elif 语句,如何优雅地判断某个数字所属的等级?

python编程-第五节-if语句-002 在编程世界里,我们经常需要扮演"侦探"角色——检查某个元素是否潜伏在我们的列表中。 想象你开了一家披萨店,顾客可以自选配料,但你需要确认他们点的配料是否在你的供应清单里。 Python为此提供了超级方便的`in`操作符,就像一位高效的餐厅领班,能瞬间告诉你某位"客人"(元素)是否在"餐厅"(列表)里。 阅读详情

偶然看到了 stackoverflow 上的一个问题,还挺有启发,故分享一下。

题目大意是:有从 A 到 F 的 5 个等级,现要判断某个数值(从 0 到 1 之间)所属的等级。举例,如数值 >= 0.9,则属于 A;若数值 >= 0.8,则属于 B;以此类推。

若使用 if-elif 语句,可能写成这样:

if scr >= 0.9:
    print('A')
elif scr >= 0.8:
    print('B')
elif scr >= 0.7:
    print('C')
elif scr >= 0.6:
    print('D')
else:
    print('F')

此写法出现了很多重复的模式,不够简洁优雅。有什么更好的写法,来实现这个目的呢?

该问题下的回答挺多的,实现思路五花八门。我挑几个可读性比较好:

方法一:使用bisect模块(数字可调)

方法二:使用 zip() 与 next()

方法三:使用字典(仅适用于 Python 3.6 以上的有序字典)

还有其它几个回答,虽然都能实现数字分级的目的,但是其可读性要差很多,因为它们要么需要你作计算和推理,要么就是引入了额外的变量。

感兴趣的话,你可在这个地址查看全部答案:https://stackoverflow.com/questions/61030617/how-can-i-simplify-repetitive-if-elif-statements

纵观全部答案后,我认为还是使用bisect的方法最高效优雅,不愧是它获得了最高的赞同票。

这里简单分析下它的实现过程。

bisect是 Python 内置的标准库,实现了二分查找算法。所谓二分查找,也被称为“折半查找”(Binary Search),其基本思想是把有序排列的 n 个元素平均分成两半,然后将待查找的 x 与中间元素比较,若 x 小于中间元素,则将左半段二分,再将 x 与其中间元素比对,以此类推。

这是一个简单的图示例子:

bisect库中的 bisect() 方法,查找元素 x 在一个升序序列中的插入点 i,使得插入点左侧的元素都小于等于 x,插入点右侧的元素都大于 x。

对照前面的例子:

from bisect import bisect 

def grade(score, breakpoints=[60, 70, 80, 90], grades='FDCBA'):
     i = bisect(breakpoints, score)
     return grades[i]

可以化简成两部分:

  • bisect([60, 70, 80, 90], score),返回插入点的值。假如 score 是 59,计算得出插入点在 60 的左侧,而 Python 列表的索引值是以 0 开始,所以返回插入点的值为 0;假如 score 是 60,计算得出插入点在 60 的右侧,即返回索引值为 1。

  • 'FDCBA'[i],返回索引值为 i 的字符。假如 i 是 0,得到“F”;假如 i 是 3,得到“B”……

二分查找算法是效率较高的算法,时间复杂度为 O(logn)。该题目的查找范围很小,所以时间效率差别不大。但是其写法称得上是 Pythonic,值得借鉴。

另外,再看看前面的方法三(使用字典),它的可读性很强,即顺次将 scr 与字典中的值比较(从高往低,即 0.9~0.5),以此得出对应的键值。(PS:它多分了一个“E”级,可去掉)

如果 Python 版本低于 3.6,则 grades.items() 会是无序的,将会破坏比较的顺序。为了兼容性,可以修改成 sorted(grades.items()):

这种写法没有引入额外的库,使用的 items() 与 sorted() 都是基础知识(相比于方法二的 zip() 与 next()),简单实用,也非常值得推荐。

不管怎么说,反复使用 if-elif 语句的判断方式是挺笨拙的,必须改进。文中列出的都是目前比较受认可的回答。

如果有面试官把它作为面试题,我觉得会挺有意思:难度不大,有发挥空间。

读者们可有其它想法?欢迎留言讨论。


● 80%的人都不知道,全球Python库下载前10名

● 我珍藏的一些好的Python代码,技巧|上篇

● 爬取300本Python书籍,用Python告诉你哪家强?

● 简单几步,100行代码用Python画一个蝙蝠侠的logo

● 我用Python分析了《青春有你2》109位漂亮小姐姐,真香!

点赞是最大的支持 

Day26:if-elif-else语句 在编程中,`if-elif-else` 语句是用来处理多分支决策的常用语句。当我们有多个条件需要判断时,`if-elif-else` 提供了一种优雅的方式来依次检查每个条件,并根据条件的真假执行不同的代码块。本章将深入探讨 `if-elif-else` 语句的结构、使用场景及其实际应用。 阅读详情

相关推荐

Java_Utils:Java常见工具类以及一些优雅的代码技巧(持续更新)

Java_Utils Java常见工具类以及一些优雅的代码技巧(持续更新)

JAVA如何避免过多if判断

java 避免if判断 Optional用法

w727655308的博客 3807

Mplus—验证性因素分析(Confirmatory Factor Analysis, CFA)

介绍一阶和二阶验证性因素分析概况及在Mplus中的操作方法。

m0_54401011的博客 1万+

不使用if,switch and 等值判断 求出两个int数中最大的那个数详解

public class PrintMax{ //不使用if ,switch ,等值判断 求出两个整数中最大的那个数 public static void main(String[] args){ PrintMax p = new PrintMax(); System.out.println(p.maxAbs(10,2)); System.out.println(p.max(8,20))

6V的专栏 868

光储微电网混合储能系统的控制策略

随着社会生产力的不断提高,对不可再生资源的大量消耗,人们已经意识到发展可再生能源的重要性,因此微电网技术作为再生能源利用的有效形式被快速发展。蓄电池容量无限大是传统光储微电网混合储能系统控制策略一种理想形式,但实际上蓄电池的容量是有限度的,传统控制策略在蓄电池剩余电量达到阖值时将无法正常使用,由此提出了光储微电网混合储能系统的新型控制策略,又结合实际情况,对开关进行了改进,利用开关与二极管并联,使其拥有四种工作状态,当储能元件剩余电量达到阈值时,可自动恢复电量降低成本,提高并输出电池电能质量。

nhkg888的博客 1751

惊爆揭秘!异步启动永磁同步电机,调速核心技术大起底

传统的同步启动方式需要额外的同步设备,成本高且维护复杂。异步启动PMSM则巧妙地利用了鼠笼感应电机的启动原理,无需额外同步设备即可实现安全可靠的启动。其核心思想是将定子电流分解为两个正交的分量:磁链分量(id)和转矩分量(iq),分别控制这两个分量,从而实现对电机转矩的精确控制。随着电机设计技术的不断进步和控制算法的不断优化,异步启动PMSM的性能将得到进一步提升,应用范围也将更加广泛。异步启动PMSM的调速技术是其核心技术之一,直接影响着电机的性能和应用范围。

wen8789的博客 986

Java当中判断学生成绩等级的方法

前言 使用两种方式来判断学生成绩的等级 第一种:if…else if…else来判断 第二种:使用switch语句来判断 一、if…else if…else来判断 代码如下(示例): import java.util.Scanner; //题目:使用键盘输入分数,来判断成绩的等级。 // 等级分为A:90~100,B:80~90,C:70~80,D:60~70,E:0~60 class test { public static void main (String[] args) { //第

wh_ab的博客 1万+

TP4054充电电路发热严重?手把手教你调整电阻值降低温度(附实测数据)

本文针对TP4054锂电池充电电路发热严重的问题,提供了详细的排错与解决方案。通过分析发热原理,指出核心在于PROG引脚电阻值设定,并手把手指导如何计算和选择正确的电阻以降低充电电流与温度。文末附有不同电阻下的实测温度与性能数据,为电子爱好者和工程师提供了实用的调试参考。

p4q5r6s7t的博客 406

利用if语句判断rgb颜色_不使用 if-elif 语句,如何优雅地判断某个数字所属的等级?...

偶然看到了 stackoverflow 上的一个问题,还挺有启发,故分享一下。题目大意是:有从 A 到 F 的 5 个等级,现要判断某个数值(从 0 到 1 之间)所属的等级。举例,如数值 >= 0.9,则属于 A;若数值 >= 0.8,则属于 B;以此类推。若使用 if-elif 语句,可能会写成这样:ifscr>=0.9:print('A')elifscr&...

weixin_39875629的博客 238

Obsidian笔记同步实战:基于Git的私有化部署与自动化管理

本文详细介绍了如何利用Git为Obsidian笔记构建私有化、自动化且免费的同步方案。通过安装配置Git与Obsidian-git插件,结合Gitee等远程仓库,实现笔记的版本管理、多设备同步与自动备份,打造安全可靠的知识管理体系。

y7z8a的博客 274

使用Matlab simulink的PLC coder功能进行算法搭建与处理

使用的案例如下: Anti-Windup PID Control Demonstration with Feedforward Control 将其中的PID块生成SCL语言再导入TIA 使用的平台如下: Matlab 2019b TIA portal 15.1 应用:可以在PLC中搭载一些并不方便使用的,或者比较难使用的算法 步骤如下: 首先打开案例,案例地址我放在最下面,点击Run运行仿真,必...

苦走一口田 1万+

pythonifelif按数字大小排列_不使用 if-elif 语句,如何优雅地判断某个数字所属的等级?...

以下文章来源于Python猫,作者豌豆花下猫偶然看到了stackoverflow上的一个问题,还挺有启发,故分享一下。题目大意是:有从 A 到 F 的 5 个等级,现要判断某个数值(从 0 到 1 之间)所属的等级。举例,如数值 >= 0.9,则属于 A;若数值 >= 0.8,则属于 B;以此类推。若使用 if-elif 语句,可能写成这样:ifscr>=0.9:print...

weixin_32310195的博客 359

【国产MCU系列】-GD32F4开发环境搭建(基于Embedded Builder)

GD32F4系列MCU采用Arm® Cortex®-M4内核,处理器主频高达240MHz,可支持算法复杂度更高的嵌入式应用,具备更快速的实时处理能力,并拥有业界领先的大容量存储优势。

视觉与物联智能 3081

拍摄中如何判断灰度等级_不使用 if-elif 语句,如何优雅地判断某个数字所属的等级?...

优质文章,第一时间送达!作者:豌豆花下猫公众号:Python 猫偶然看到了 stackoverflow 上的一个问题,还挺有启发,故分享一下。题目大意是:有从 A 到 F 的 5 个等级,现要判断某个数值(从 0 到 1 之间)所属的等级。举例,如数值 >= 0.9,则属于 A;若数值 >= 0.8,则属于 B;以此类推。若使用 if-elif 语句,可能写成这样:if scr &gt...

weixin_39616045的博客 166

SolidWorks速成教程P4-4【装配体 | 第四节】——装配体内修改模型&编辑配合方法&配合报错的解决方法

截止目前已介绍完 SolidWorks装配体的常用功能,但基础薄弱的小伙伴或许对装配体的各类功能还不够熟悉。所以这节将进一步加强装配体的学习,同时介绍新手容易犯的错误。总结出三点,一是装配体内修改模型,二是编辑配合,三是配合报错的解决方法。

嵌入式阿齐Archie 5554

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

不使用 if-elif 语句优雅地判断

题目大意是:有从 A 到 F 的 5 个等级,现要判断某个数值(从 0 到 1 之间)所属的等级。举例,如数值 >= 0.9,则属于 A;若数值 >= 0.8,则属于 B;以此类推。 若使用 if-elif 语句,可能写成这样: if scr >= 0.9: print('A') elif scr >= 0.8: print('B') elif scr &g...

weixin_45080696的博客 757

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Python小技巧!如何简化大量的 if…elif…else 代码?

花下猫语:在日常代码中,我们总是会面对大量 if...elif...else 条件分支选择的问题。说实话,我在多数情况下首推就是老老实实地写 if...elif,并且设法把每个分支下的内容...

cainiao_python的博客 8038

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

python判断数字在哪个区间_Python3基础 if elif 示例 判断一个数在哪个区间内

Python : 3.7.0OS : Ubuntu 18.04.1 LTSIDE : PyCharm 2018.2.4Conda : 4.5.11typesetting : Markdowncode"""@Author : 行初心@Date : 18-9-24@Blog : www.cnblogs.com/xingchuxin@Gitee : gitee.com/zhichengjiu...

weixin_39847732的博客 3712

Python基础 - if elif else多分支语句的应用场景

本文探讨了Python中if-elif-else多分支语句的核心应用场景。通过用户交互菜单和表单验证两个典型案例,展示了该结构如何优雅处理复杂逻辑决策:1)在命令行工具中清晰解析用户输入指令,避免深层嵌套;2)实现分层数据验证机制,遵循错误优先原则提升健壮性。文章强调多分支语句能有效降低代码复杂度,其自上而下的短路特性使逻辑流程更直观,是替代嵌套if和match-case(低版本兼容)的理想选择。实战代码配合流程分析,揭示了条件语句在真实项目中的结构化应用艺术。

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

python中if elif语句优化_关于python:当else被做得最多时,最有效的if-elif-elif-else语句的方法是什么?...

我有一个in-if-elif-elif-else语句,其中99%的时间执行else语句:if something == 'this':doThis()elif something == 'that':doThat()elif something == 'there':doThere()else:doThisMostOfTheTime()这个构造做了很多,但是因为它在碰到其他东西之前就已经克服了所有...

weixin_42308943的博客 712

【我的Python通关秘籍】从被报错虐到优雅编程03

1. 在Python中,可以表示真假的数据类型是:布尔类型,字面量True表示真,字面量False表示假2. 除了可以定义布尔类型外,还可以通过什么计算得到布尔类型?通过<比较运算符>计算得到布尔类型的结果:== 判断是否相等,!= 判断是否不相等> 判断是否大于,< 判断是否小于>= 判断是否大于等于,<= 判断是否小于等于。

淵_ken的博客 1323
上一篇: 用Python爬取《龙岭迷窟》评论,看看比同系列鬼吹灯作品以及《盗墓笔记》好在哪里?...
下一篇: Python 炫技操作,连接列表的八种方法
菜鸟学Python
博客等级 码龄9年 8087粉丝 571原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值