用字典代替'if-elif-else'
在实际应用中,我们经常会需要采用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'的更多相关文章
- python笔记:#014#综合应用
综合应用 -- 名片管理系统 目标 综合应用已经学习过的知识点: 变量 流程控制 函数 模块 开发 名片管理系统 系统需求 程序启动,显示名片管理系统欢迎界面,并显示功能菜单 ************ ...
- Python基础综合运用——搭建名片管理系统
综合应用 —— 名片管理系统 目标 综合应用已经学习过的知识点: 变量 流程控制 函数 模块 开发 名片管理系统 系统需求 程序启动,显示名片管理系统欢迎界面,并显示功能菜单 ************ ...
- python基础提高演练(名片管理系统的开发)
综合应用 —— 名片管理系统 目标 综合应用已经学习过的知识点: 变量 流程控制 函数 模块 开发 名片管理系统 系统需求 1. 程序启动,显示名片管理系统欢迎界面,并显示功能菜单 ********* ...
- python名片 项目
---恢复内容开始--- 综合应用 —— 名片管理系统 目标 综合应用已经学习过的知识点: 变量 流程控制 函数 模块 开发 名片管理系统 系统需求 程序启动,显示名片管理系统欢迎界面,并显示功能菜单 ...
- python函数基础算法简介
一.多层语法糖本质 """ 语法糖会将紧挨着的被装饰对象名字当参数自动传入装饰器函数中""" def outter(func_name): ...
- 【DG】Oracle_Data_Guard官方直译
[DG]Oracle Data Guard官方直译 1 Oracle Data Guard 介绍 Oracle Data Guard概念和管理10g版本2 Oracle Data Guard ...
- DVWA实验之Brute Force(暴力破解)- Low
DVWA实验之Brute Force-暴力破解- Low 这里开始DVWA的相关实验~ 有关DVWA环境搭建的教程请参考: https://www.cnblogs.com/0yst3r-2 ...
- Oracle错误览表
Oracle 错误总结及问题解决 ORA 本文转自:https://www.cnblogs.com/zhangwei595806165/p/4972016.html 作者@承影剑 ORA-0 ...
- python学习笔记(字符串操作、字典操作、三级菜单实例)
字符串操作 name = "alex" print(name.capitalize()) #首字母大写 name = "my name is alex" pri ...
- python容器类型:列表,字典,集合等
容器的概念我是从C++的STL中学到的 什么是容器? 容器是用来存储和组织其他对象的对象. 也就是说容器里面可以放很多东西,这些东西可以是字符串,可以是整数,可以是自定义类型,然后把这些东西有组织的存 ...
随机推荐
- yile接口
后台接口: ---------------------------更改订单状态接口(需要主站长账号权限,主站要有接口权限)更改订单状态(可批量更新),如需退款/退单请用订单退款退单接口,如需更新订单数 ...
- 利用socket以及多线程、文件流等方法实现通信,互发文本信息以及文件
服务器端: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data ...
- pgsql中物化视图的使用
1.创建物化视图 CREATE MATERIALIZED VIEW "view_xxx" as select * from 表 2.刷新物化视图 refresh material ...
- 渗透H5棋牌游戏-棋牌游戏开发
0x01 前言 本來不想发的,涉及太多利益了,這些棋牌游戏的源码最高能卖到几万.开发起来不比一个商场进程难. 最近又太忙了,沒时间去做代码审计的文章了,但一不小心又抢了个运气王... 0x02 开始 ...
- 容器之 docker的监控平台(prometheus + Grafana)
cAdvisor (Container Advisor) :用于收集正在运行的容器资源使用和性能信息.https://github.com/google/cadvisor Prometheus(普罗米 ...
- Docker部署netdata 性能实时监控
netdata 是常用的Linux系统性能实时监控面板 netdata 官方文档 https://learn.netdata.cloud/ 1.Docker 镜像下载地址 https://hub.do ...
- a 标签下载文件重命名文件失效
背景 : a标签下载cos桶文件download失效 原因:下载的链接跨域,download 属性重命名文件失效,浏览器无法获取到文件,无法进行更改. 解决办法: downloadFile(url, ...
- 初学银河麒麟linux笔记 第七章 VMWare虚拟机内的qt程序连接串口和网口
QT程序可以正常在虚拟机里的麒麟系统里运行了,但是无法连接网口和串口,这里进行配置 网口连接 与硬件的TCP连接,在虚拟机上设置桥接 再重启就能连上了 串口连接 首先参考 https://blog.c ...
- ajv参数验证
1.验证枚举类型 var schema = { "properties": { "data": { "type": "object ...
- 云函数调用云函数 openid不存在
最近发现了一个问题 就是我使用云函数调用云函数的时候,将openid存入数据库发现为空,怎么回事呢,一查, 原来是这样 还是没有仔细看文档的错啊