在实际应用中,我们经常会需要采用if-elif-else控制语句以根据不同条件,作出不同的操作。if-elif-else固然可以,但是它也存在冗余的缺点,特别是当条件较多时这一缺点尤为明显。因此,本文考虑采用字典来处理这一情况。

Python的字典是由键值对构成,键是唯一的,并且每个键都有唯一的值对应。因此,我们可以将条件控制语句中的条件作为,将相应条件下的操作作为。如果“操作”较为复杂时,我们可以将其打包为一个函数,并将此函数作为字典的“值”。

举例如下:

import numpy as np
np.random.seed(1234)
true_label = np.random.choice(np.array([0,1]),
size=10000, p = [0.5, 0.5],
replace=True)
pred_prob = np.random.rand(10000) metric = 'precision'
perform = np.zeros_like(pred_prob)
for j, thres in enumerate(pred_prob):
pred_label = np.where(pred_prob>=thres, 1, 0)
if metric == 'recall':
perform[j] = np.logical_and(pred_label, true_label).sum()/true_label.sum()
elif metric == 'precision':
perform[j] = np.logical_and(pred_label, true_label).sum()/pred_label.sum()
elif metric == 'accuracy':
perform[j] = 1 - np.logical_xor(pred_label, true_label).sum()/pred_label.shape[0]

上述代码是利用条件控制语句,根据需要计算"召回率"、"精准率"、“准确率”,具体需要即由变量metric控制。与之对应的字典版本即为

def recall(pred_label, true_label):
return np.logical_and(pred_label, true_label).sum()/true_label.sum()
def precision(pred_label, true_label):
return np.logical_and(pred_label, true_label).sum()/pred_label.sum()
def accuracy(pred_label, true_label):
return 1 - np.logical_xor(pred_label, true_label).sum()/pred_label.shape[0] metric_dict = {'recall' : recall,
'precision': precision,
'accuracy' : accuracy}
metric = 'precision'
evalua = np.zeros_like(pred_prob)
for i, thres in enumerate(pred_prob):
pred_label = np.where(pred_prob>=thres, 1, 0)
evalua[i] = metric_dict.get(metric, None)(pred_label, true_label)

可以看到,条件控制语句中的操作被打包成了函数,并作为字典中的值。接下来根据键,对字典的值进行索取即可,而这里的键值即为条件,也由变量metric控制。

用字典代替'if-elif-else'的更多相关文章

  1. python笔记:#014#综合应用

    综合应用 -- 名片管理系统 目标 综合应用已经学习过的知识点: 变量 流程控制 函数 模块 开发 名片管理系统 系统需求 程序启动,显示名片管理系统欢迎界面,并显示功能菜单 ************ ...

  2. Python基础综合运用——搭建名片管理系统

    综合应用 —— 名片管理系统 目标 综合应用已经学习过的知识点: 变量 流程控制 函数 模块 开发 名片管理系统 系统需求 程序启动,显示名片管理系统欢迎界面,并显示功能菜单 ************ ...

  3. python基础提高演练(名片管理系统的开发)

    综合应用 —— 名片管理系统 目标 综合应用已经学习过的知识点: 变量 流程控制 函数 模块 开发 名片管理系统 系统需求 1. 程序启动,显示名片管理系统欢迎界面,并显示功能菜单 ********* ...

  4. python名片 项目

    ---恢复内容开始--- 综合应用 —— 名片管理系统 目标 综合应用已经学习过的知识点: 变量 流程控制 函数 模块 开发 名片管理系统 系统需求 程序启动,显示名片管理系统欢迎界面,并显示功能菜单 ...

  5. python函数基础算法简介

    一.多层语法糖本质 """ 语法糖会将紧挨着的被装饰对象名字当参数自动传入装饰器函数中""" def outter(func_name): ...

  6. 【DG】Oracle_Data_Guard官方直译

    [DG]Oracle Data Guard官方直译 1 Oracle Data Guard 介绍   Oracle Data Guard概念和管理10g版本2   Oracle Data Guard ...

  7. DVWA实验之Brute Force(暴力破解)- Low

    DVWA实验之Brute Force-暴力破解- Low     这里开始DVWA的相关实验~   有关DVWA环境搭建的教程请参考: https://www.cnblogs.com/0yst3r-2 ...

  8. Oracle错误览表

    Oracle 错误总结及问题解决 ORA     本文转自:https://www.cnblogs.com/zhangwei595806165/p/4972016.html  作者@承影剑 ORA-0 ...

  9. python学习笔记(字符串操作、字典操作、三级菜单实例)

    字符串操作 name = "alex" print(name.capitalize()) #首字母大写 name = "my name is alex" pri ...

  10. python容器类型:列表,字典,集合等

    容器的概念我是从C++的STL中学到的 什么是容器? 容器是用来存储和组织其他对象的对象. 也就是说容器里面可以放很多东西,这些东西可以是字符串,可以是整数,可以是自定义类型,然后把这些东西有组织的存 ...

随机推荐

  1. cximage总括功能讲解

    CxImage的功能 Constructors  构造函数 Initialization  初始化 File 文件操作,主要是编解码 Generic 图像基本变化 DSP 图像处理操作 Paintin ...

  2. 【HTML】HTML特殊字符大全

    使用方法:这些字符属于unicode字符集,所以,你的文档需要声明为UTF-8:下面符号列表的后面有两列编号,它们并不太一样,第一列是用于html的,你需要在前面加上&#符号:第二列可以用于C ...

  3. err has no member, has initializer but incomplete type

    原因:没有头文件

  4. npm -D与-S

    --save == -S -S, --save 安装包信息将加入到dependencies(生产阶段的依赖,也就是项目运行时的依赖,就是程序上线后仍然需要依赖) --save-dev == -D -D ...

  5. 【redis】配置优化及从库优先级

    https://blog.51cto.com/u_15902893/5912902 vim /etc/redis/redis.conf ##################基础############ ...

  6. Linux查询CPU,内存,硬盘使用率以及网卡流量指令

    Linux查询CPU,内存,硬盘使用率以及网卡流量指令 1.获取cpu使用率 //cpu `top -b -n1 | fgrep "Cpu" | awk '{print 100-$ ...

  7. 09 spark连接mysql数据库

    安装启动检查Mysql服务.netstat -tunlp (3306) spark 连接mysql驱动程序.–cp /usr/local/hive/lib/mysql-connector-java-5 ...

  8. C++ MFC学习 (一)

    MFC:微软基础类库,以C++形式封装了WindowsAPI,并且包含一个应用程序框架,以减少应用程序开发人员的工作量.    其中包含的类包含大量Windows句柄封装类和很多Windows的内建控 ...

  9. vue数组传值到后端

    const arrays= ["zhangsan","lisi"] 请求方式:GET vue前端: getDetailList({arrays:arrays}) ...

  10. ubuntu18 电脑重启后登录后无法进入桌面

    ubuntu18 电脑重启后登录后无法进入桌面 应该是ubuntu桌面管理器gdm3和nvidia驱动冲突导致的 解决办法: 首先卸载已有的nvidia驱动 注意:在下载完驱动后,此时电脑没有驱动文件 ...