复杂指标计算公式

1. 题目描述

  • 要求:输入一组复杂指标计算公式以及公式中包含的基础指标的值,计算出指定指标的值并返回

    • 复杂指标公式示例

      • [123654] = [6598]/[6665] *{100}
      • 其中 [] 中的内容为复杂指标,{} 中的为整型常量
  • 输入描述

    输入一个字符串使用分号分隔符为如下3部分

    1. 一组指标的计算公式,公式之间使用逗号 , 分隔
    2. 所有基础指标的值,指标值使用如 [1254]=3 来表示,指标之间用 , 分隔
    3. 需要计算的指标ID

    注意

    1. 公式中只会出现 “+”, “-”, “*", "/", "[指标ID]”, "{整数}" 六种格式
    2. 复杂指标公式中可能含有复杂指标
    3. 所有数据均为整数,且公式中运算结果包括除法也保证结果为整数
  • 输入输出示例
    • 输入

      [1234]=[12]+[34]*{50},[12]=[1]+[2]/{2};[1]=10,[2]=20,[34]=50;[1234]

    • 输出

      2520

2. 代码部分

废话少说,先上 python 3代码:

PRIORITY = {"+": 1, "-": 1, "*": 2, "/": 2}  # 运算符及其优先级

def calc(var, all_vars):
    """迭代计算给定变量的值"""
    if type(all_vars[var]) is int:
        return all_vars[var]  # 字典中的值为整型,说明计算完成,直接返回值
    formula = list(all_vars[var])  # 公式转换为列表,方便从左到右遍历
    numbers = list()  # 数字栈
    operators = list()  # 符号栈
    number = ''  # 公式中与数字相关的量
    while True:
        if not formula:
            # 到公式未尾,如果数字不为空,则压入最后一个变量对应的整数
            if number:
                numbers.append(calc(number, all_vars))
            # 清空符号栈
            while operators:
                numbers.append(calc_two_number(numbers, operators))  # 计算结果要压入数字栈
            all_vars[var] = numbers[-1]  # 将字典中的公式更新为整型值
            return numbers.pop() 

        ch = formula.pop(0)  # 从左向右遍历
        if "0" <= ch <= "9":
            number += ch  # 拼接数字
            if formula:
                # 判断当前数字的拼接是否到头
                if formula[0] == "}":
                    # 说明读入的数字为整形常量
                    formula.pop(0)
                    numbers.append(int(number))
                    number = ""
                elif formula[0] in PRIORITY.keys():
                    numbers.append(calc(number, all_vars))  # 递归运算
                    number = ""
        elif ch in PRIORITY.keys():
            if operators and PRIORITY[ch] <= PRIORITY[operators[-1]]:
                numbers.append(calc_two_number(numbers, operators))
            operators.append(ch)

def calc_two_number(numbers, operators):
    """计算两个数的值"""
    right = numbers.pop()  # 先弹左值
    left = numbers.pop()  # 再弹右值
    oper = operators.pop()
    if oper == "+":
        return left + right
    elif oper == "-":
        return left - right
    elif oper == "*":
        return left * right
    elif oper == "/":
        return left // right  # 定要防止出现小数

def handle_input_str(input_str):
    """处理输入的字符串,提取逗号分隔的 3 个部分的内容"""
    input_list = input_str.replace('[', '').replace(']', '').split(';')  # [ ] 于计算无实际作用,去掉
    res_var = input_list[2]
    all_vars = dict()  # 所有 [] 中对应变量组成的字典

    # 根据 = 号分出左右值,左值作为字典的键,右值作为字典的值
    second_part = input_list[1].split(',')
    for item in second_part:
        left_right = item.split('=')
        all_vars[left_right[0]] = int(left_right[1])  # 储存为整型值
    first_part = input_list[0].split(',')
    for item in first_part:
        left_right = item.split('=')
        all_vars[left_right[0]] = left_right[1]  # 将公式储存入字典中

    return res_var, all_vars

def main(input_str):
    if not input_str:
        input_str = input()
    res_var, all_vars = handle_input_str(input_str)
    print(calc(res_var, all_vars))

if __name__ == "__main__":
    main('[1234]=[12]+[34]*{50},[12]=[1]+[2]/{2};[1]=10,[2]=20,[34]=50;[1234]')

3. 代码解释

主要用到的数据结构为栈和字典

handle_input_str 函数主要是对输入的字符串进行处理,将复杂指标储存为字典的键,其对应的值可能为实际结果(计算值),也可能是复杂公式。其中,由于 [] 在计算中基本不起作用,故从公式中去掉

calc 函数则用用来计算给定的复杂指标,如果字典 all_vars 中复杂指标对应的值已为整型,则直接返回其值即可。否则需要计算复杂公式

复杂公式的计算与常规的字符串的四则运算相同,基础的数据结构是采用一个符号栈和一个数字栈,代码中直接使用 python 内建的 list 类型来起到栈的作用。与四则运算不同的是,需要判断读取到的数字是复杂指标还是常量,如果是复杂指标,则迭代调用 calc 函数进行计算。

calc 函数计算得到最终值后,需要更新 all_vars 中的值,以避免重复计算

calc_two_numbers 函数中的除法,要用 // 整除符号

原文地址:https://www.cnblogs.com/lijunjie9502/p/11484273.html

时间: 2024-08-30 12:58:47

复杂指标计算公式的相关文章

PE、PB、PS、ROE、EPS含义及计算公式

PE:市盈率 = 股价 / 每股盈利 PB:市净率=股价 / 每股净资产 PS:市销率=股价 / 每股收入=总市值 / 销售收入 ROE:净资产收益率=报告期净利润/报告期末净资产 EPS:每股盈余=盈余 / 流通在外股数 or      每股收益=期末净利润 / 期末总股本 PE:Price/Earnings 市盈率 也有叫做PER的,Price/Earnings Ratio本益比,价格收益比,市盈率    市盈率反映市场对企业盈利的看法.市盈率越高暗示市场越看好企业盈利的前境.对於投资者来说

复杂网络节点重要性评价方法初探

在一个网络中,不同的节点起着大小不同的作用.以社交网络为例,有意见领袖的大V,有死寂沉沉的僵尸粉:以交通网络为例,有至关重要的交通枢纽,有无关痛痒的备用中转站.在使用复杂网络分析业务问题时,如何区分网络中不同节点的重要性程度,就是一个需要考虑的问题.为了解决我们自己的业务问题,顺便了解了一下相关的方法,特记录一下,若有益于相关领域的同学,则幸甚. 一.要实现的目标 对网络中的节点定义一个指标,可用来定量地衡量每个节点在网络中重要性的大小. 二.相关的一些方法总结 分析节点的重要性,业界较多地从网

朴素贝叶斯方法在乳腺肿块检测中的应用

写在开头: 临近毕业准备找工作,而机器学习方法是复习中不可缺少的一个重要部分,所以本篇博文是将之前做过的一个项目里面应用的机器学习方法——朴素贝叶斯方法,重点复习一遍.具体文章如下引用所示. Zhang S, Chen Z, Gu S, et al. Breast tumor detection in double views mammography based on Simple Bias[C]. Medical Imaging Physics and Engineering (ICMIPE)

WPF实现强大的动态公式计算

数据库可以定义表不同列之间的计算公式,进行自动公式计算,但如何实现行上的动态公式计算呢?行由于可以动态扩展,在某些应用场景下将能很好的解决实际问题. 1.VS2012新建一个WPF应用程序WpfApp_DynCalc,并添加一个类DynCalc.cs,如下图: 2.编辑MainWindow.xaml,代码如下: 1 <Window x:Class="WpfApp_DynCalc.MainWindow" 2 xmlns="http://schemas.microsoft.

什么是挣值?如何计算?

假设一项工作的工期是10天,预算成本是100元:也就是每天的完成进度是10%左右:每天的成本投入是10元左右.现在,在的第五天末的时候,我们监控项目的时候发现: 1.工作只完成了40% 2.实际成本已经花费了60元 看来项目的执行情况很糟,在进度和成本两个方面都不尽人意,那么到现在,项目情况是如何的呢?那么到底糟到什么程度呢?我们用以下指标来说明: 1.挣值(EV),已经完成工作的预算成本. 计算公式为:任务预算成本*已经完成作业的百分比 如例,即:100*40%=40元 为完成前面的工作,预算

决策树(ID3,C4.5,CART)原理以及实现

决策树 决策树是一种基本的分类和回归方法.决策树顾名思义,模型可以表示为树型结构,可以认为是if-then的集合,也可以认为是定义在特征空间与类空间上的条件概率分布. [图片上传失败...(image-2e6565-1543139272117)] 决策树的中间节点可以看做是对一种特征的判断,也是符合上一次判断特征某种取值的数据集,根节点代表所有数据集;叶子节点看做是判断所属的类别. 决策树学习通常包括3个步骤: 特征选择. 决策树生成和决策树剪枝. 目前常用的决策树算法有ID3, C4.5 和C

数据库-IO系统性能之衡量性能的几个指标

转自http://storage.it168.com/a2011/0323/1169/000001169755_all.shtml 作为一个数据库管理员,关注系统的性能是日常最重要的工作之一,而在所关注的各方面的性能只能IO性能却是最令人头痛的一块,面对着各种生涩的参数 和令人眼花缭乱的新奇的术语,再加上存储厂商的忽悠,总是让我们有种云里雾里的感觉.本系列文章试图从基本概念开始对磁盘存储相关的各种概念进行综合归 纳,让大家能够对IO性能相关的基本概念,IO性能的监控和调整有个比较全面的了解. 在

推荐系统评测指标—准确率(Precision)、召回率(Recall)、F值(F-Measure)

下面简单列举几种常用的推荐系统评测指标: 1.准确率与召回率(Precision & Recall) 准确率和召回率是广泛用于信息检索和统计学分类领域的两个度量值,用来评价结果的质量.其中精度是检索出相关文档数与检索出的文档总数的比率,衡量的是检索系统的查准率:召回率是指检索出的相关文档数和文档库中所有的相关文档数的比率,衡量的是检索系统的查全率. 一般来说,Precision就是检索出来的条目(比如:文档.网页等)有多少是准确的,Recall就是所有准确的条目有多少被检索出来了. 正确率.召回

公式财务人员常用的计算公式—下篇,怀才当遇整理

5.现金流量分析 现金流量表的主要作用是:第一,提供本企业现金流量的实际情况:第二,有助于评价本期收益质量,第三,有助于评价企业的财务弹性,第四,有助于评价企业的流动性:第五,用于预测企业未来的现金流量. 流动性分析 流动性分析是将资产迅速转变为现金的能力. (1)现金到期债务比 公式:现金到期债务比=经营活动现金净流量 / 本期到期的债务 本期到期债务=一年内到期的长期负债+应付票据 意义:以经营活动的现金净流量与本期到期的债务比较,可以体现企业的偿还到期债务的能力. 分析提示:企业能够用来偿